JetPack怎么使用Activity中的导航菜单
创始人
2024-12-17 15:41:56
0次

提前做好准备,打开文件 res/navigation/ 下你的 xml 文件,点击每一个 Fragment 页面,给它们设置对应的标题,在 Design 下的右边的 id 下,有一个属性是 label ,填写上对应的名称就可。

1. 使用 Activity 中的导航菜单

默认 Activity 的导航菜单显示的是标题和返回按钮,而返回按钮是返回到上一个 Activity ,而我们的 Navigation 是在一个 Activity 中的,假如当前 Activity 位于栈的最上层,我学习的代码就是让所有的 Fragment 都在 MainActivity 中,由于无论我怎样跳转都在 MainActivity 中。所以现在有两个两个任务:

  1. 首先跳转到下一页以后会出现返回按钮;

  2. 点击返回按钮能够正常返回上一个 Navigation 页面。

因为第二个需要在第一个完成的基础上才能看得出效果,所以我们按上面的步骤进行。

本来的效果:

JetPack怎么使用Activity中的导航菜单

默认效果
打开承载了 Fragment 的 Activity 的 java 文件,我这里是 MainActivity.java,在 onCreate 方法下增加如下代码:

@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);  NavController navController = navHostFragment.getNavController();  appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();  NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);}

android 官方获取 navController 是直接获取的 Navigation.findNavController(this, R.id.nav_host_fragment); ,假如很不幸你也这样写了,那么就会出现的错误:

Caused by: java.lang.IllegalStateException: Activity com.example.learnjetpack.MainActivity@b516fb8 does not have a NavController set on 2131230962

只需修改成我上面那样即可以处理这个问题,至于起因我现在解释不了,以后会补全。上面的代码就是托管本来 Activity 的 Bar 。

JetPack怎么使用Activity中的导航菜单

Navigation托管Activity后的效果
这样第一个完成了,至于第二个,只要要重写本来 Activity 的返回的逻辑:

@Overridepublic boolean onSupportNavigateUp() {  NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);  NavController navController = navHostFragment.getNavController();  return NavigationUI.navigateUp(navController, appBarConfiguration)            || super.onSupportNavigateUp();}

接下来看看最终的效果。

JetPack怎么使用Activity中的导航菜单

最终的效果
我还遇到了一个问题,之前我的 MainActivity 的 theme 设置 android:theme="@style/Theme.AppCompat.Light.NoActionBar" ,结果出现了下面的错误:

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference

把这个改掉就可,由于设置 NoActionBar 了,结果又让显示,诚然手机就会耍小脾气。这个是在 AndroidManifest.xml 中设置的。

2. 使用 Toolbar

这种方式就是不用默认的,而是自己设置;所以这个很容易想到需要将 MainActivity 的 theme 改为上面会出现错误的情况。打开 AndroidManifest.xml 文件,修改对应的 Activity 的 theme,修改成 @style/Theme.AppCompat.Light.NoActionBar 。

JetPack怎么使用Activity中的导航菜单

没有bar的效果
打开对应的 Activity 下的布局文件,我这里是 MainActivity ,布局文件为 activity_layout.xml ,在 androidx.fragment.app.FragmentContainerView 上增加:

先看看效果:


JetPack怎么使用Activity中的导航菜单

自己设置头部的效果

接下来让其显示内容。

同样在 Activity 中的增加:

@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  NavHostFragment navHostFragment = (NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);  NavController navController = navHostFragment.getNavController();  AppBarConfiguration appBarConfiguration =            new AppBarConfiguration.Builder(navController.getGraph()).build();  Toolbar toolbar = findViewById(R.id.toolbar);  NavigationUI.setupWithNavController(            toolbar, navController, appBarConfiguration);}

这种方式 Navigation 会自动托管 Toolbar ,这样即可以轻松实现上面的效果,其余的代码就不需要,看效果:

JetPack怎么使用Activity中的导航菜单

使用 Toolbar 最终的效果

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...