android 导航栏navigation

时间:2025-01-27 08:02:58

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);

    }