Android支持直接创建带有NavigationView的Activity,这里主要介绍NavigationView的逻辑。

NavigationView通常是跟DrawerLayout一起使用。DrawerLayout下面就包含俩个控件,第一个是内容,第二个是滑屏。

页面

页面代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".module.MainActivity">

<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/Theme.frist.AppBarOverlay">

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/bgbule"
app:popupTheme="@style/Theme.frist.PopupOverlay" />

</com.google.android.material.appbar.AppBarLayout>

<fragment
android:id="@+id/nav_host_fragment_content_main"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:defaultNavHost="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_hostfragment_main" />


<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@android:drawable/ic_dialog_email" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/nav_menu_main" />
</androidx.drawerlayout.widget.DrawerLayout>

容器1

如代码所示,内容里放了一个可以被控制的fragment,name为androidx.navigation.fragment.NavHostFragment代表他是被NavigationView控制的fragment。

app:navGraph属性,设置为nav_hostfragment_main,代表控制他的xml文件是navigation文件夹下的nav_hostfragment_main。

nav_hostfragment_main.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_hostfragment_main"
app:startDestination="@+id/nav_frist">

<fragment
android:id="@+id/nav_frist"
android:name="com.kiba.learn.module.Fragment.FristFragment"
android:label="first"
tools:layout="@layout/fragment_frist" /> </navigation>

app:layout_behavior属性为固定字符串【com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior】,代表他是在头部的bar之下。

容器2

容器2是NavigationView,app:headerLayout指定了NavigationView的Header的Xml文件;app:menu指定了NavigationView菜单的Xml文件。

菜单的xml很简单,就是一组item,如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view">

<group android:checkableBehavior="single">
<item
android:id="@+id/nav_frist"
android:icon="@drawable/ic_menu_gallery"
android:title="frist" /> </group>
</menu>

代码

Activity代码如下:

通过NavController指定页面内的fragment为可以被控制的fragment,然后实现,滑出的菜单点击,切换fragment。

private AppBarConfiguration mAppBarConfiguration;
private ActivityMainBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);//设置自定义bar //region navView配置
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_first)
.setDrawerLayout(binding.drawerLayout)
.build();//配置切换fragment时,使用的id
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);//指定页面内的fragment为可以被控制的fragment
//绑定fragment和navigation的配置
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(binding.navView, navController);
binding.navView.setCheckedItem(R.id.nav_frist);//设置当前选中项
binding.navView.setNavigationItemSelectedListener(view->{
int s= view.getItemId();

return true;
});
//endregion

Fragment currentFragment = FragmentManager.findFragment(this.findViewById(R.id.nav_host_fragment_content_main));//获取当前Activity下的fragment }

//显示并配置右上设置菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.set_menu, menu);
return true;
}

//显示并配置左上navigation控制按钮
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
//系统返回按钮触发
@Override
public void onBackPressed() {
fristFragment sf = (fristFragment)getFragment(fristFragment.class);
Intent loginActivity=new Intent(this,LoginActivity.class);
startActivity(loginActivity);
super.onBackPressed();
}

public Fragment getFragment(Class<?> clazz) {
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments!= null && fragments.size() > 0) {
NavHostFragment navHostFragment = (NavHostFragment) fragments.get(0);
List<Fragment> childfragments = navHostFragment.getChildFragmentManager().getFragments();
if(childfragments != null && childfragments.size() > 0){
for (int j = 0; j < childfragments.size(); j++) {
Fragment fragment = childfragments.get(j);
if(fragment.getClass().isAssignableFrom(clazz)){

return fragment;
}
}
}
}
return null;
}

PS1:使用FragmentManager可以获取到当前Activity下 的fragment 如:FragmentManager.findFragment(this.findViewById(R.id.xxx));

PS2:onCreateOptionsMenu的重新会让右上角的菜单显示,不重载则不显示。

PS3:onSupportNavigateUp会让左上角的菜单显示,不重载则不显示。

PS4:使用NavigationView导航fragment时,fragment的name是androidx.navigation.fragment.NavHostFragment,此时想获取指定的fragment可以使用getFragment函数,注意该函数在onCreate中获取不到fragment。

调用代码如下:

SFragment sf = (SFragment)getFragment(SurveyFragment.class);

  

----------------------------------------------------------------------------------------------------

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

NavigationView使用简介的更多相关文章

  1. NavigationViewDemo【和DrawerLayout搭配使用实现侧滑导航视图界面】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 主要记录NavigationView的使用,而一般情况下NavigationView是和DrawerLayout搭配使用的,还有To ...

  2. 一个C#开发搭建Android框架的心路历程

    前言 Java框架实在是太多了,因为是初学乍练,所以,只好以百度为标准选择框架了. Java的框架文章太难写了,因为他引用了太多框架,而没一个框架都有很繁琐的配置,把每个框架都写一遍,就等于写书了:所 ...

  3. 【转】GitHub 排名前 100 的安卓、iOS项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  4. GitHub Android Libraries Top 100 简介

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...

  5. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...

  6. 64.GitHub 排名前100的android项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  7. GitHub Android Librarys Top 100 简介

    GitHub Android Librarys Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索J ...

  8. <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介

    转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...

  9. Material Design: NavigationView FlaotingActionBar SnackBar采用

    转载 请明确说明 MingsangAndroid 本文介绍了Design Support Library的引入 拥抱Android Design Support Library新变化(导航视图.悬浮A ...

随机推荐

  1. 手动制作Docker镜像

    手动制作 Docker 镜像 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器(用来用去感觉 Windows 的 Docker 出各种问题,比如使用 ...

  2. error: subscripted value is neither array nor pointer问题解决

    在运行程序的时候报错:error: subscripted value is neither array nor pointer 原因分析:下标值不符合数组或指针要求,即操作的对象不允许有下标值. 出 ...

  3. 5.10学习总结——Activity的跳转和传值

    使用sharedpreference是对信息的存储,也可以进行传值,今天通过查找资料,学习了Activity的跳转和传值方法. 跳转 1.显示跳转 4种方法 1 2 3 4 5 6 7 8 9 10 ...

  4. 使用fiddler抓包模拟器及配置fiddler过滤

    一. 安装fiddler https://www.telerik.com/fiddler 二. 配置fiddler,一下的ip要根据自己电脑情况设置 然后重启Fiddler,一定要重启!!! 三.配置 ...

  5. ThinkPHP5通过composer安装Workerman安装失败问题

    报错: topthink/think-worker v3.0.2 requires topthink/framework ^6 https://blog.csdn.net/Douz_lungfish/ ...

  6. django中csrf_token处理方式

    第一:先在HTML中加入{% csrf_token %} $.ajax({ url: '{% url "ceshi:list" %}', type: 'post', dataTyp ...

  7. JPA自动生成表

    一句话总结: 在配置文件中 jpa-hibernate-ddl-auto:update validate 加载 Hibernate 时,验证创建数据库表结构 create 每次加载 Hibernate ...

  8. 使用three.js实现炫酷的酸性风格3D页面

    背景 近期学习了 WebGL 和 Three.js 的一些基础知识,于是想结合最近流行的酸性设计风格,装饰一下个人主页,同时总结一些学到的知识.本文内容主要介绍,通过使用 React + three. ...

  9. Java(一)——基础知识

    引言 之前一直对 Java 怀有固执的偏见,以为 Java 是编写前端的语言,作为一个机械生,非常抗拒去学它. 但是最近接触一点以后,完全改观了先前的看法,于是开启了对 Java 的大学习. 一.数据 ...

  10. pymysql链接时,密码含有特殊符号。

    类如含有@之类的特殊符号,在链接数据库时,需要提前url转码,不然会报密码错误. python3/2分别引用是同样的第三方库,但是引用方式不同 python2 from urllib import q ...