navigation有3个重要的组成部分:导航图 、NavHost 、NavController;
导航图即为xml文件
1、依赖:
dependencies {
def nav_version = "2.4.1"
// Java language implementation
implementation ":navigation-fragment:$nav_version"
implementation ":navigation-ui:$nav_version"
// Kotlin
implementation ":navigation-fragment-ktx:$nav_version"
implementation ":navigation-ui-ktx:$nav_version"
// Feature module Support
implementation ":navigation-dynamic-features-fragment:$nav_version"
// Testing Navigation
androidTestImplementation ":navigation-testing:$nav_version"
// Jetpack Compose Integration
implementation ":navigation-compose:$nav_version"
}
2、NavHost的xml文件创建:
2.1、在“Project”窗口中,右键点击 res 目录,然后依次选择 New > Android Resource File。此时系统会显示 New Resource File 对话框。
2.2、在 File name 字段中输入名称,例如“nav_graph”。
2.3、从 Resource type 下拉列表中选择 Navigation,然后点击 OK。
文件如下:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:andro
xmlns:app="/apk/res-auto"
android:
app:startDestination="@id/homeFragment">表示第一个启动的fragment
设置id,name是fragment的名称;例如我的:MeFragment
<fragment android:
android:name=""/>
<fragment android:
android:name=""/>
</navigation>
3、在activity布局中:
<RelativeLayout xmlns:andro
xmlns:tools="/tools"
xmlns:app="/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".">
<fragment
android:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name=""
app:navGraph="@navigation/nav_graph"/>指定的NavHost
</RelativeLayout>
在main class中:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
(savedInstanceState);
(this,.main_navigation);
}
至此,基本的使用已完成
-
点击事件、跳转,导航栏
nav_graph.xml:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:andro
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:
app:startDestination="@id/mefragment">
//通用的2个事件:
<action android:
app:destination="@id/homefragment"
app:enterAnim="@anim/nav_default_pop_enter_anim"
app:exitAnim="@anim/nav_default_pop_exit_anim"/>
<action android:
app:destination="@id/mefragment"
app:enterAnim="@anim/nav_default_pop_enter_anim"
app:exitAnim="@anim/nav_default_pop_exit_anim"/>
<fragment android:
android:name=""
tools:layout="@layout/fragment_me">
<deepLink app:uri="/{params}"/>
</fragment>
<fragment android:
android:name=""
tools:layout="@layout/fragment_home">
<argument android:name="name" android:defaultValue="max"/>
</fragment>
</navigation>
- main activity布局文件:
<?xml version="1.0" encoding="utf-8"?>
< xmlns:andro
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:
android:name=""
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"/>
导航栏
<
android:
android:layout_width="match_parent"
android:layout_height="50dp"
app:menu="@menu/menu"
app:itemIconTint="drawble" 可以设置选中的颜色
app:itemTextColor="" 字体颜色、大小都可以设置
app:labelVisibilityMode="labeled" 导航栏显示图标和显示文字
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintVertical_bias="1"/>
</>
这里的menu是res目录下的menu文件夹:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:andro>
<item
android:
android:icon="@mipmap/ic_launcher"
android:title="我的"/>
<item
android:
android:icon="@mipmap/ic_launcher"
android:title="首页"/>
</menu>
我们需要在mainActivity中绑定容器和导航栏:
private void initView() {
BottomNavigationView navBtn=findViewById(.main_nav_btn);
NavController navController = (this, .main_fragment);
这里如果我们需要对导航栏跳转时做判断,比如判断用户是否登录,未登录,就不跳转或者处理其他事件;
这里返回true,则表示拦截不跳转,false则正常跳转;
(new () {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (()){
case :
(.action_to_homefragment);
break;
case :
(.action_to_mefragment);
break;
}
// return true表示拦截,不让跳转,
return true;
}
});
// 绑定navBtn和navControl
(navBtn,navController);
}