NavigationView使用简介
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使用简介的更多相关文章
- NavigationViewDemo【和DrawerLayout搭配使用实现侧滑导航视图界面】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 主要记录NavigationView的使用,而一般情况下NavigationView是和DrawerLayout搭配使用的,还有To ...
- 一个C#开发搭建Android框架的心路历程
前言 Java框架实在是太多了,因为是初学乍练,所以,只好以百度为标准选择框架了. Java的框架文章太难写了,因为他引用了太多框架,而没一个框架都有很繁琐的配置,把每个框架都写一遍,就等于写书了:所 ...
- 【转】GitHub 排名前 100 的安卓、iOS项目简介
GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...
- GitHub Android Libraries Top 100 简介
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...
- 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)
排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...
- 64.GitHub 排名前100的android项目简介
GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...
- GitHub Android Librarys Top 100 简介
GitHub Android Librarys Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索J ...
- <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介
转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...
- Material Design: NavigationView FlaotingActionBar SnackBar采用
转载 请明确说明 MingsangAndroid 本文介绍了Design Support Library的引入 拥抱Android Design Support Library新变化(导航视图.悬浮A ...
随机推荐
- 手动制作Docker镜像
手动制作 Docker 镜像 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器(用来用去感觉 Windows 的 Docker 出各种问题,比如使用 ...
- error: subscripted value is neither array nor pointer问题解决
在运行程序的时候报错:error: subscripted value is neither array nor pointer 原因分析:下标值不符合数组或指针要求,即操作的对象不允许有下标值. 出 ...
- 5.10学习总结——Activity的跳转和传值
使用sharedpreference是对信息的存储,也可以进行传值,今天通过查找资料,学习了Activity的跳转和传值方法. 跳转 1.显示跳转 4种方法 1 2 3 4 5 6 7 8 9 10 ...
- 使用fiddler抓包模拟器及配置fiddler过滤
一. 安装fiddler https://www.telerik.com/fiddler 二. 配置fiddler,一下的ip要根据自己电脑情况设置 然后重启Fiddler,一定要重启!!! 三.配置 ...
- ThinkPHP5通过composer安装Workerman安装失败问题
报错: topthink/think-worker v3.0.2 requires topthink/framework ^6 https://blog.csdn.net/Douz_lungfish/ ...
- django中csrf_token处理方式
第一:先在HTML中加入{% csrf_token %} $.ajax({ url: '{% url "ceshi:list" %}', type: 'post', dataTyp ...
- JPA自动生成表
一句话总结: 在配置文件中 jpa-hibernate-ddl-auto:update validate 加载 Hibernate 时,验证创建数据库表结构 create 每次加载 Hibernate ...
- 使用three.js实现炫酷的酸性风格3D页面
背景 近期学习了 WebGL 和 Three.js 的一些基础知识,于是想结合最近流行的酸性设计风格,装饰一下个人主页,同时总结一些学到的知识.本文内容主要介绍,通过使用 React + three. ...
- Java(一)——基础知识
引言 之前一直对 Java 怀有固执的偏见,以为 Java 是编写前端的语言,作为一个机械生,非常抗拒去学它. 但是最近接触一点以后,完全改观了先前的看法,于是开启了对 Java 的大学习. 一.数据 ...
- pymysql链接时,密码含有特殊符号。
类如含有@之类的特殊符号,在链接数据库时,需要提前url转码,不然会报密码错误. python3/2分别引用是同样的第三方库,但是引用方式不同 python2 from urllib import q ...