我有一个HomeActivity
实现了NavigationView
没有ToolBar(带有ActionBar)。在本活动中,我实现用于导航至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
片段中,我有一个监听器来打开一个新活动:
@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;
}
它打开一个活动,但没有上一个片段的后退按钮。在操作栏中添加此按钮的正确方法是什么?
EDIT:我希望按钮返回到先前的片段SettingsFragment
,而不是保存片段的活动。为什么实现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是保存片段的活动
编辑:如果您想导航回SettingFragment,最好使用Android Jetpack导航组件。它让您似乎使用片段。链接在这里: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上的goto res文件夹,右键单击它,新建> android资源文件您会看到以下对话框:
注意资源类型,必须选择导航
[第3步:由于已经创建了片段,请转到保存片段的活动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是将处理您的片段的类,navGraph将是您先前创建的导航文件。
[步骤4:将片段添加到导航文件,打开在步骤2中创建的导航文件,将选项卡切换为设计。如下图所示
注意您的将是空的。使用加号(屏幕截图中的1)将片段添加到设计视图中。请注意(屏幕截图中的2)起始片段,该片段将首先膨胀。表示当您打开MainActivity时,导航图中的开始片段将可见。
卷曲箭头是操作或导航。例如,在我的屏幕快照中,起始片段转到注册片段和登录片段,这仅意味着起始片段可以导航到图形内的片段中。如果未在导航图中定义,则不会导航。换句话说,嘿,我将来会希望从启动片段导航到注册片段或登录片段,请注意!
步骤5:,当您要从图中的片段导航到片段时,实例化NavController的实例:
private NavController controller;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle
savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
controller = Navigation.findNavController(view);
}
NavController将允许您导航,我通常在onViewCreated()上实例化它
然后:
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view){ controller.navigate(R.id.action_startFragment_to_anotherFragment); } });
要使用片段设置操作栏,请将以下代码放入主机活动的onCreate()中:
NavController mNavigationController = Navigation.findNavController(this,R.id.nav_host_frag); NavigationUI.setupActionBarWithNavController(this, mNavigationController);
也在主机活动中:
@Override
public boolean onSupportNavigateUp() {
return mNavigationController.navigateUp();
}
@Override
public void onBackPressed() {
super.onBackPressed();
}