JetPack怎么使用Activity中的导航菜单
导读:本文共3447字符,通常情况下阅读需要11分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 提前做好准备,打开文件res/navigation/下你的xml文件,点击每一个Fragment页面,给它们设置对应的标题,在Design下的右边的id下,有一个属性是label,填写上对应的名称就可。1. 使用Activity中的导航菜单默认Activity的导航菜单显示的是标题和返回按钮,而返回按钮是返回到上一个Activity,而我们的Navigation... ...
目录
(为您整理了一些要点),点击可以直达。提前做好准备,打开文件res/navigation/
下你的xml
文件,点击每一个Fragment
页面,给它们设置对应的标题,在Design
下的右边的id
下,有一个属性是label
,填写上对应的名称就可。
1. 使用Activity
中的导航菜单
默认Activity
的导航菜单显示的是标题和返回按钮,而返回按钮是返回到上一个Activity
,而我们的Navigation
是在一个Activity
中的,假如当前Activity
位于栈的最上层,我学习的代码就是让所有的Fragment
都在MainActivity
中,由于无论我怎样跳转都在MainActivity
中。所以现在有两个两个任务:
首先跳转到下一页以后会出现返回按钮;
点击返回按钮能够正常返回上一个
Navigation
页面。
因为第二个需要在第一个完成的基础上才能看得出效果,所以我们按上面的步骤进行。
本来的效果:
默认效果
打开承载了Fragment
的Activity
的java
文件,我这里是MainActivity.java
,在onCreate
方法下增加如下代码:
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);NavHostFragmentnavHostFragment=(NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);NavControllernavController=navHostFragment.getNavController();appBarConfiguration=newAppBarConfiguration.Builder(navController.getGraph()).build();NavigationUI.setupActionBarWithNavController(this,navController,appBarConfiguration);}
android 官方获取navController
是直接获取的Navigation.findNavController(this, R.id.nav_host_fragment);
,假如很不幸你也这样写了,那么就会出现的错误:
Causedby:java.lang.IllegalStateException:Activitycom.example.learnjetpack.MainActivity@b516fb8doesnothaveaNavControllerseton2131230962
只需修改成我上面那样即可以处理这个问题,至于起因我现在解释不了,以后会补全。上面的代码就是托管本来Activity
的Bar
。
Navigation托管Activity后的效果
这样第一个完成了,至于第二个,只要要重写本来Activity
的返回的逻辑:
@OverridepublicbooleanonSupportNavigateUp(){NavHostFragmentnavHostFragment=(NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);NavControllernavController=navHostFragment.getNavController();returnNavigationUI.navigateUp(navController,appBarConfiguration)||super.onSupportNavigateUp();}
接下来看看最终的效果。
最终的效果
我还遇到了一个问题,之前我的MainActivity
的theme
设置android:theme="@style/Theme.AppCompat.Light.NoActionBar"
,结果出现了下面的错误:
Causedby:java.lang.NullPointerException:Attempttoinvokevirtualmethod'voidandroidx.appcompat.app.ActionBar.setTitle(java.lang.CharSequence)'onanullobjectreference
把这个改掉就可,由于设置NoActionBar
了,结果又让显示,诚然手机就会耍小脾气。这个是在AndroidManifest.xml
中设置的。
2. 使用 Toolbar
这种方式就是不用默认的,而是自己设置;所以这个很容易想到需要将MainActivity
的theme
改为上面会出现错误的情况。打开AndroidManifest.xml
文件,修改对应的Activity
的theme
,修改成@style/Theme.AppCompat.Light.NoActionBar
。
没有bar的效果
打开对应的Activity
下的布局文件,我这里是MainActivity
,布局文件为activity_layout.xml
,在androidx.fragment.app.FragmentContainerView
上增加:
<androidx.appcompat.widget.Toolbarandroid: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
中的增加:
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);NavHostFragmentnavHostFragment=(NavHostFragment)getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);NavControllernavController=navHostFragment.getNavController();AppBarConfigurationappBarConfiguration=newAppBarConfiguration.Builder(navController.getGraph()).build();Toolbartoolbar=findViewById(R.id.toolbar);NavigationUI.setupWithNavController(toolbar,navController,appBarConfiguration);}
这种方式Navigation
会自动托管Toolbar
,这样即可以轻松实现上面的效果,其余的代码就不需要,看效果:
使用 Toolbar 最终的效果
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
JetPack怎么使用Activity中的导航菜单的详细内容,希望对您有所帮助,信息来源于网络。