• NavigationView导航视图与DrawerLayout绘制布局


    目录

    1. 基础使用方法:

    (1) 准备NavigationView的hearderLayout和menu的XML文件

    (2) 创建DrawerLayout,并在DrawerLayout放置NavigationView

    (3) 设置NavigationView菜单项监听及其他设置

    2. 显示自定义菜单项的菜单:

    (1) 创建自定义菜单项的xml布局文件

    (2) 设置菜单项布局为自定义菜单项

    (3)设置自定义菜单项中的子控件及Header中的子控件

    3. 展开/关闭 DrawerLayout中的NavigationView

    (1) Java代码展开

    (2) 手势操作展开

    (3) Java代码关闭

    (4) 手势操作关闭 

    4. 常见的问题

    (1) 监听器无法触发

    (2) Menu自定义布局不显示

    (3) Menu自定义布局重叠


    NaviagtionView(导航视图)需与DrawerLayout(绘制布局)配合使用。

    DrawerLayout中的Navigation有两种表现方式,左划出和右划出,可在标签中使用android:layout_gravity属性设置,值为start时为左划出,为end时为右划出。一个DrawerLayout中可以同时含有左划出和右划出的两个导航视图,和Activity主体空间

    NaviagtionView中有两部分,上部分的header和下部分的menu,可在标签中使用android:headerLayout和android:menu属性设置。但这两个部分也可以有不设置的,或都不设置。其中菜单可以为自定义菜单项的菜单。

    1. 基础使用方法:

    (1) 准备NavigationView的hearderLayout和menu的XML文件

    NavigationView默认展示菜单的title和icon的黑色阴影图标,但NavigationView支持显示自定义菜单项布局的菜单,详情请见下文。

    tools:showIn="navigation_view"可让预览图为菜单在导航视图中的样子。

    1. // res\layout\navigation_view_header_layout.xml
    2. "1.0" encoding="utf-8"?>
    3. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="wrap_content">
    7. RelativeLayout>
    1. // res\menu\navigation_view_menu.xml
    2. "1.0" encoding="utf-8"?>
    3. <menu xmlns:tools="http://schemas.android.com/tools"
    4. xmlns:android="http://schemas.android.com/apk/res/android"
    5. xmlns:app="http://schemas.android.com/apk/res-auto"
    6. tools:showIn="navigation_view">
    7. <item
    8. android:id="@+id/item1"
    9. android:title="title1"
    10. android:icon="@drawable/icon1" />
    11. <item
    12. android:id="@+id/item2"
    13. android:title="title2"
    14. android:icon="@drawable/icon2" />
    15. menu>

    (2) 创建DrawerLayout,并在DrawerLayout放置NavigationView

    请确保NavigationView位于DrawerLayout中所有控件的最后,确保它是 DrawerLayout 的最后一个子 View。这样可以确保 NavigationView 处于较高的 Z 轴顺序,使其能够响应触摸事件。

    在DrawerLayout中使用tools:openDrawer属性可以使预览图中的NavigationView展开,方便编写。

    在DrawerLayout中放入NavigationView后一定要设置android:layout_gravity为start或end,用于设置左划出或右划出。

    NaviagtionView中有两部分,上部分的header和下部分的menu,可在可在标签中使用android:headerLayout和android:menu属性设置。但这两个部分也可以有不设置的,或都不设置。

    1. "1.0" encoding="utf-8"?>
    2. <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainActivity"
    8. tools:openDrawer="start"
    9. >
    10. <RelativeLayout
    11. android:layout_width="match_parent"
    12. android:layout_height="match_parent">
    13. RelativeLayout>
    14. <com.google.android.material.navigation.NavigationView
    15. android:layout_width="250dp"
    16. android:layout_height="match_parent"
    17. android:id="@+id/navigationView"
    18. android:layout_gravity="start"
    19. app:headerLayout="@layout/navigation_view_header_layout"
    20. app:menu="@menu/navigation_view_menu"
    21. />
    22. androidx.drawerlayout.widget.DrawerLayout>

    (3) 设置NavigationView菜单项监听及其他设置

    1. // MainActivity.java
    2. NavigationView navigationView=findViewById(R.id.navigationView);
    3. navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
    4. public boolean onNavigationItemSelected(MenuItem item) {
    5. //选中菜单项执行
    6. int menuItemId=item.getItemId();
    7. return true;
    8. }
    9. });
    10. //如为自定义菜单项,可进行子控件设置
    11. //例:
    12. Menu menu=navigationView.getMenu();
    13. View menuItemView=menu.findItem(R.id.item1).getActionView();
    14. ImageView imageView=menuItemView.findViewById(R.id.~);
    15. imageView.setImageResource(R.drawable.~);
    16. //设置NavigationView中header的子控件
    17. //当只有一个header时,getHeaderView的参数index为0
    18. View headerView=navigationView.getHeaderView(0);
    19. TextView headerTextView=headerView.findViewById(R.id.navigation_view_head_textView);
    20. headerTextView.setText("Str");
    21. //DrawerLayout绘制布局显示NavigationView导航视图
    22. DrawerLayout drawerLayout=findViewById(R.id.drawerLayout);
    23. drawerLayout.openDrawer( GravityCompat.START );
    24. drawerLayout.openDrawer( GravityCompat.END );

    2. 显示自定义菜单项的菜单:

    NavigationView支持显示自定义菜单项布局的菜单,用于替代只能显示黑色icon阴影图标与title的菜单。

    在菜单项中添加app:actionLayout属性即可自定义菜单项布局。在设置本属性时请不要设置title,可能会导致冲突,可用tools:ignore="MenuTitle"替代title。

    请注意是app:actionLayout不是android:actionLayout

    (1) 创建自定义菜单项的xml布局文件

    1. // res\layout\menu_item_layout.xml
    2. "1.0" encoding="utf-8"?>
    3. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    4. android:layout_width="match_parent"
    5. android:layout_height="wrap_content">
    6. RelativeLayout>

    (2) 设置菜单项布局为自定义菜单项

    在菜单项中添加app:actionLayout属性即可自定义菜单项布局

    tools:showIn="navigation_view"可让预览图为菜单在导航视图中的样子。

    1. // res\menu\navigation_view_menu.xml
    2. "1.0" encoding="utf-8"?>
    3. <menu xmlns:tools="http://schemas.android.com/tools"
    4. xmlns:android="http://schemas.android.com/apk/res/android"
    5. xmlns:app="http://schemas.android.com/apk/res-auto"
    6. tools:showIn="navigation_view">
    7. <item
    8. android:id="@+id/item1"
    9. app:actionLayout="@layout/menu_item_layout"
    10. tools:ignore="MenuTitle" />
    11. <item
    12. android:id="@+id/item2"
    13. app:actionLayout="@layout/menu_item_layout"
    14. tools:ignore="MenuTitle"/>
    15. menu>

    (3)设置自定义菜单项中的子控件及Header中的子控件

    使用自定义菜单项时可使用navigationView.getMenu()获取菜单对象,使用menu.findItem()获取指定菜单项,然后使用getActionView()获取菜单项的View,最后使用view.findViewById()获取指定控件。

    使用navigationView.getHeaderView(int index)获取Header的View对象,使用view.findViewById()获取指定控件。

    1. // MainActivity.java
    2. //如为自定义菜单项,可进行子控件设置
    3. //例:
    4. Menu menu=navigationView.getMenu();
    5. View menuItemView=menu.findItem(R.id.item1).getActionView();
    6. ImageView imageView=menuItemView.findViewById(R.id.~);
    7. imageView.setImageResource(R.drawable.~);
    8. //设置NavigationView中header的子控件
    9. //当只有一个header时,getHeaderView的参数index为0
    10. View headerView=navigationView.getHeaderView(0);
    11. TextView headerTextView=headerView.findViewById(R.id.navigation_view_head_textView);
    12. headerTextView.setText("Str");

    3. 展开/关闭 DrawerLayout中的NavigationView

    (1) Java代码展开

    1. //DrawerLayout绘制布局显示NavigationView导航视图
    2. DrawerLayout drawerLayout=findViewById(R.id.drawerLayout);
    3. drawerLayout.openDrawer( GravityCompat.START );
    4. drawerLayout.openDrawer( GravityCompat.END );

    (2) 手势操作展开

    长按边缘然后向中间划动。

    (3) Java代码关闭

    1. //DrawerLayout绘制布局显示NavigationView导航视图
    2. DrawerLayout drawerLayout=findViewById(R.id.drawerLayout);
    3. drawerLayout.closeDrawer( GravityCompat.START );
    4. drawerLayout.closeDrawer( GravityCompat.END );

    (4) 手势操作关闭 

    NavigationView向两边划动。

    4. 常见的问题

    (1) 监听器无法触发

    NavigationItemSelectedListener失效可能是因为NavigationView在DrawerLayout中所处的位置无法接收到触碰事件。

    请确保NavigationView位于DrawerLayout中所有控件的最后,确保它是 DrawerLayout 的最后一个子 View。这样可以确保 NavigationView 处于较高的 Z 轴顺序,使其能够响应触摸事件。

    (2) Menu自定义布局不显示

    NavigationView中的Menu如果使用自定义列表项布局,不显示的原因大概率是布局引用属性使用错误或未使用。

    正确的使用方法是在app:actionLayout="@layout/menu_item_layout"请注意是app不是android,系统可能会建议android,请更改为app。

    (3) Menu自定义布局重叠

    NavigationView中的Menu如果使用自定义列表项布局,布局重叠的原因大概率是item中使用了title属性,删除该属性或用tools:ignore="MenuTitle"替代即可解决。

  • 相关阅读:
    python项目中使用requirement.txt依赖提高项目的移植效率
    nginx学习记录-URL Rewrite
    Java基础练习题---this
    C语言回顾(指针篇)
    大规模 Transformer 模型 8 比特矩阵乘简介 - 基于 Hugging Face Transformers、Accelerate 以及 bitsandbytes
    【C语言】文件的操作与文件函数的使用(详细讲解)
    丁鹿学堂:css预处理器之less学习(一)
    IoU的计算实现详解(基于Python)
    java计算机毕业设计基于安卓Android/微信小程序的小区智能超市购物商城APP
    JavaScript数组常用的方法整理
  • 原文地址:https://blog.csdn.net/m0_57150356/article/details/134332218