当前位置:   article > 正文

NavigationView导航视图与DrawerLayout绘制布局_navigationview getmenu

navigationview getmenu

目录

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

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

1. 基础使用方法:

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

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

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

  1. // res\layout\navigation_view_header_layout.xml
  2. <?xml version="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. <!-- 该部分为NaviagtionView上部分,高度不能为match_parent,要为menu留空间 !-->
  8. </RelativeLayout>
  1. // res\menu\navigation_view_menu.xml
  2. <!-- 该菜单用于NavigationView下部分 !-->
  3. <?xml version="1.0" encoding="utf-8"?>
  4. <menu xmlns:tools="http://schemas.android.com/tools"
  5. xmlns:android="http://schemas.android.com/apk/res/android"
  6. xmlns:app="http://schemas.android.com/apk/res-auto"
  7. tools:showIn="navigation_view">
  8. <item
  9. android:id="@+id/item1"
  10. android:title="title1"
  11. android:icon="@drawable/icon1" />
  12. <item
  13. android:id="@+id/item2"
  14. android:title="title2"
  15. android:icon="@drawable/icon2" />
  16. </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,可在可在<NaviagtionView>标签中使用android:headerLayout和android:menu属性设置。但这两个部分也可以有不设置的,或都不设置。

  1. <?xml version="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. <!-- Activity主体空间 !-->
  14. </RelativeLayout>
  15. <com.google.android.material.navigation.NavigationView
  16. android:layout_width="250dp"
  17. android:layout_height="match_parent"
  18. android:id="@+id/navigationView"
  19. android:layout_gravity="start"
  20. app:headerLayout="@layout/navigation_view_header_layout"
  21. app:menu="@menu/navigation_view_menu"
  22. />
  23. </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. <?xml version="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. <!-- 自定义菜单项 !-->
  7. </RelativeLayout>

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

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

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

  1. // res\menu\navigation_view_menu.xml
  2. <?xml version="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如果使用自定义列表项布局,不显示的原因大概率是布局引用属性使用错误或未使用。

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

(3) Menu自定义布局重叠

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

tag: 导航栏 , 绘制布局  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/219247
推荐阅读
相关标签
  

闽ICP备14008679号