这篇文章主要介绍了JetPack怎么使用Activity中的导航菜单的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JetPack怎么使用Activity中的导航菜单文章都会有所收获,下面我们一起来看看吧。
提前做好准备,打开文件 res/navigation/
下你的 xml
文件,点击每一个 Fragment
页面,给它们设置对应的标题,在 Design
下的右边的 id
下,有一个属性是 label
,填写上对应的名称就可。
Activity
中的导航菜单默认 Activity
的导航菜单显示的是标题和返回按钮,而返回按钮是返回到上一个 Activity
,而我们的 Navigation
是在一个 Activity
中的,假如当前 Activity
位于栈的最上层,我学习的代码就是让所有的 Fragment
都在 MainActivity
中,由于无论我怎样跳转都在 MainActivity
中。所以现在有两个两个任务:
首先跳转到下一页以后会出现返回按钮;
点击返回按钮能够正常返回上一个 Navigation
页面。
因为第二个需要在第一个完成的基础上才能看得出效果,所以我们按上面的步骤进行。
本来的效果:
默认效果
打开承载了 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
。
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();}
接下来看看最终的效果。
最终的效果
我还遇到了一个问题,之前我的 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
中设置的。
这种方式就是不用默认的,而是自己设置;所以这个很容易想到需要将 MainActivity
的 theme
改为上面会出现错误的情况。打开 AndroidManifest.xml
文件,修改对应的 Activity
的 theme
,修改成 @style/Theme.AppCompat.Light.NoActionBar
。
没有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" />
先看看效果:
自己设置头部的效果
接下来让其显示内容。
同样在 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
,这样即可以轻松实现上面的效果,其余的代码就不需要,看效果:
使用 Toolbar 最终的效果
关于“JetPack怎么使用Activity中的导航菜单”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“JetPack怎么使用Activity中的导航菜单”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。