如何在打开的 activity 的操作栏中的片段中添加后退按钮?
How to add a back button to the fragment in the action bar of an opened activity?
我有一个 HomeActivity
实现 NavigationView
不带 ToolBar(带 ActionBar)。在这个 activity 中,我实现了 onNavigationItemSelected
用于导航到 SettingsFragment
:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
// more code
getSupportFragmentManager().beginTransaction().replace(R.id.container,new DashboardActivity()).commit();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// more code
getSupportFragmentManager().beginTransaction().replace(R.id.container,new SettingsFragment()).commit();
}
在 SettingsFragment
片段中我有一个监听器打开一个新的 activity:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
fragmentView = inflater.inflate(R.layout.activity_settings, container, false);
FloatingActionButton fab = (FloatingActionButton) fragmentView.findViewById(R.id.myfab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getActivity(), SubSettingsActivity.class);
fragmentView.getContext().startActivity(intent);
startActivity(intent);
}
});
return fragmentView;
}
它打开一个 activity 但没有返回到上一个片段的按钮。在操作栏中添加此按钮的正确方法是什么?
编辑:我希望按钮返回到前一个片段SettingsFragment
,而不是返回到包含片段的activity。为什么实施 NavigationView
如此困难?
您的 SubSettingsActivity 的主题应该扩展
Theme.AppCompat.Light.DarkActionBar
然后在 java 中执行 onCreate
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
然后在 AndroidManifest 中你声明 SubSettingsActivity 做:
android:parentActivity="YOUR_ACTIVITY"
YOUR_ACTIVITY 是 activity 持有 fragment
编辑:
如果您想导航回 SettingFragment,最好使用 Android Jetpack 导航组件。
它让你无缝地使用片段。
这是 link:
https://developer.android.com/guide/navigation/navigation-migrate
如何实现导航组件 :简单的方法
第 1 步:
添加所需的依赖项
implementation 'androidx.navigation:navigation-fragment:2.3.0-alpha05'
implementation 'androidx.navigation:navigation-ui:2.3.0-alpha05'
第 2 步:
转到 Android Studio 上的 res 文件夹,右键单击它,新建 > android 资源文件
您将看到以下对话框:
注意资源类型,必须选择导航
第 3 步: 由于您的片段已创建,请转到包含片段的 activity xml 例如 activity_main.xml 添加以下内容:
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/adView"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/main_nav"
android:id="@+id/nav_host_frag"/>
NavHostFragment 是将处理您的片段的 class,navGraph 将是您之前创建的导航文件。
第 4 步: 将您的片段添加到导航文件中,打开您在第 2 步中创建的导航文件,将选项卡切换到设计。如下图所示
注意你的将是空的。使用添加符号(屏幕截图中的 1)将您的片段添加到设计视图中。注意(屏幕截图中的 2)起始片段,这是将首先膨胀的片段。意味着当您打开 MainActivity 时,它是导航图中可见的开始片段。
卷曲箭头是动作或导航。例如,在我的屏幕截图中,起始片段转到注册片段和登录片段,它仅表示起始片段可以导航到图形内片段的位置。如果它没有在导航图中定义,它就不会导航。换句话说,嘿 nav 我以后会想从启动片段导航到注册片段或登录片段,注意!
第 5 步: 当您想从图形中的片段导航到片段时实例化 NavController 的实例:
private NavController controller;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle
savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
controller = Navigation.findNavController(view);
}
NavController 会让你导航,我通常在 ViewCreated()
上实例化它
然后:
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
controller.navigate(R.id.action_startFragment_to_anotherFragment);
}
});
要使用片段设置操作栏,请将以下代码放入主机 activity 的 onCreate() 中:
NavController mNavigationController = Navigation.findNavController(this,R.id.nav_host_frag);
NavigationUI.setupActionBarWithNavController(this, mNavigationController);
也在主机中 activity:
@Override
public boolean onSupportNavigateUp() {
return mNavigationController.navigateUp();
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
我有一个 HomeActivity
实现 NavigationView
不带 ToolBar(带 ActionBar)。在这个 activity 中,我实现了 onNavigationItemSelected
用于导航到 SettingsFragment
:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
// more code
getSupportFragmentManager().beginTransaction().replace(R.id.container,new DashboardActivity()).commit();
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// more code
getSupportFragmentManager().beginTransaction().replace(R.id.container,new SettingsFragment()).commit();
}
在 SettingsFragment
片段中我有一个监听器打开一个新的 activity:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
fragmentView = inflater.inflate(R.layout.activity_settings, container, false);
FloatingActionButton fab = (FloatingActionButton) fragmentView.findViewById(R.id.myfab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getActivity(), SubSettingsActivity.class);
fragmentView.getContext().startActivity(intent);
startActivity(intent);
}
});
return fragmentView;
}
它打开一个 activity 但没有返回到上一个片段的按钮。在操作栏中添加此按钮的正确方法是什么?
编辑:我希望按钮返回到前一个片段SettingsFragment
,而不是返回到包含片段的activity。为什么实施 NavigationView
如此困难?
您的 SubSettingsActivity 的主题应该扩展
Theme.AppCompat.Light.DarkActionBar
然后在 java 中执行 onCreate
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
然后在 AndroidManifest 中你声明 SubSettingsActivity 做:
android:parentActivity="YOUR_ACTIVITY"
YOUR_ACTIVITY 是 activity 持有 fragment
编辑: 如果您想导航回 SettingFragment,最好使用 Android Jetpack 导航组件。 它让你无缝地使用片段。 这是 link: https://developer.android.com/guide/navigation/navigation-migrate
如何实现导航组件 :简单的方法
第 1 步: 添加所需的依赖项
implementation 'androidx.navigation:navigation-fragment:2.3.0-alpha05'
implementation 'androidx.navigation:navigation-ui:2.3.0-alpha05'
第 2 步:
转到 Android Studio 上的 res 文件夹,右键单击它,新建 > android 资源文件
您将看到以下对话框:
注意资源类型,必须选择导航
第 3 步: 由于您的片段已创建,请转到包含片段的 activity xml 例如 activity_main.xml 添加以下内容:
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/adView"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/main_nav"
android:id="@+id/nav_host_frag"/>
NavHostFragment 是将处理您的片段的 class,navGraph 将是您之前创建的导航文件。
第 4 步: 将您的片段添加到导航文件中,打开您在第 2 步中创建的导航文件,将选项卡切换到设计。如下图所示
注意你的将是空的。使用添加符号(屏幕截图中的 1)将您的片段添加到设计视图中。注意(屏幕截图中的 2)起始片段,这是将首先膨胀的片段。意味着当您打开 MainActivity 时,它是导航图中可见的开始片段。
卷曲箭头是动作或导航。例如,在我的屏幕截图中,起始片段转到注册片段和登录片段,它仅表示起始片段可以导航到图形内片段的位置。如果它没有在导航图中定义,它就不会导航。换句话说,嘿 nav 我以后会想从启动片段导航到注册片段或登录片段,注意!
第 5 步: 当您想从图形中的片段导航到片段时实例化 NavController 的实例:
private NavController controller;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle
savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
controller = Navigation.findNavController(view);
}
NavController 会让你导航,我通常在 ViewCreated()
上实例化它然后:
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
controller.navigate(R.id.action_startFragment_to_anotherFragment);
}
});
要使用片段设置操作栏,请将以下代码放入主机 activity 的 onCreate() 中:
NavController mNavigationController = Navigation.findNavController(this,R.id.nav_host_frag);
NavigationUI.setupActionBarWithNavController(this, mNavigationController);
也在主机中 activity:
@Override
public boolean onSupportNavigateUp() {
return mNavigationController.navigateUp();
}
@Override
public void onBackPressed() {
super.onBackPressed();
}