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

发布时间:2022-04-16 15:42:35 作者:iii
来源:亿速云 阅读:192

这篇文章主要介绍了JetPack怎么使用Activity中的导航菜单的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JetPack怎么使用Activity中的导航菜单文章都会有所收获,下面我们一起来看看吧。

提前做好准备,打开文件 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 上增加:

<androidx.appcompat.widget.Toolbar      android:id="@+id/toolbar"      android:layout_width="0dp"      android:layout_height="?attr/actionBarSize"      app:layout_collapseMode="pin"      app:layout_constraintBottom_toTopOf="@+id/nav_host_fragment"      app:layout_constraintEnd_toEndOf="parent"      app:layout_constraintStart_toStartOf="parent"      app:layout_constraintTop_toTopOf="parent" />

先看看效果:


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 最终的效果

关于“JetPack怎么使用Activity中的导航菜单”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“JetPack怎么使用Activity中的导航菜单”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. JetPack中的LiveData+ViewModel使用
  2. Activity中isFinishing()如何判断Activity的状态

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jetpack activity

上一篇:HTTP服务压力测试工具及相关术语是什么

下一篇:NetBeans中如何搭建一个Android SDK环境

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》