在创建APP的基本框架的时候,最开始搭建的就是导航栏,然后往里塞东西,所以在创建导航栏时,有多种方式。

1、BottomNavigationBar + ViewPager + Fragment

这种方式 在之前项目中有介绍过,所以可以去翻之前的博客,这里就不再赘述。

2、BottomNavigationView + Fragment

这是JectPack组件出现之后,常用的一种导航栏模式,涉及到Navigation的用法,在之前的《JectPack组件开发3-----Navigation的用法》提及到。

首先在使用BottomNavigationView之前,先做一些准备工作。

(1)创建navigation文件

(2)创建menu菜单

menu菜单作为底部导航栏的资源。

<menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+id/first"android:title="第一个"android:icon="@drawable/ic_airline_seat_flat_angled_black_24dp"></item><item android:id="@+id/second"android:title="第二个"android:icon="@drawable/ic_airline_seat_flat_angled_black_24dp"></item><item android:id="@+id/third"android:title="第三个"android:icon="@drawable/ic_airline_seat_flat_angled_black_24dp"></item>
</menu>

(3)添加BottomNavigationView组件

需要设置底部导航的资源,并放到底部;左右点连接代表和父容器对齐,高度选择wrap_content。


(4)添加Fragment

高度选择match_constraint显示就是0dp

(5)设置导航

        bottomNavigationView = findViewById(R.id.bottomNavigationView);NavController controller = Navigation.findNavController(this,R.id.fragment);//底部导航栏的配置AppBarConfiguration configuration = new AppBarConfiguration.Builder(controller.getGraph()).build();//这种方式不会有back的按键AppBarConfiguration configuration = new AppBarConfiguration.Builder(bottomNavigationView.getMenu()).build();NavigationUI.setupActionBarWithNavController(this,controller,configuration);NavigationUI.setupWithNavController(bottomNavigationView,controller);

要注意的一点是:menu中每个Item的id一定要和每个Fragment的id一致,否则导航无法生效。

3、原始的RadioGruop + FrameLayout

在使用这种导航形式时,就需要使用Fragment事务管理,将Fragment添加到FrameLayout中显示。

    private int currentIndex = 0;private Fragment[] fragments;FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();firstFragment = new FirstFragment();secondFragment = new SecondFragment();thirdFragment = new ThirdFragment();fragments = new Fragment[]{firstFragment,secondFragment,thirdFragment};//把首页添加进去transaction.add(R.id.fl_main,firstFragment).commit();//默认选中第一个select(currentIndex);
private void select(int index) {if(currentIndex == index){return;}//隐藏当前的FragmentFragmentTransaction ft = getSupportFragmentManager().beginTransaction();ft.hide(fragments[currentIndex]);if(!fragments[index].isAdded()){ft.add(R.id.fl_main,fragments[index]);}else{ft.show(fragments[index]);}ft.commit();currentIndex = index;}

然后RadioGroup设置点击事件:

 rg_main.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId){case R.id.rb_first:select(0);break;case R.id.rb_second:select(1);break;case R.id.rb_third:select(2);break;}}});

在开启Frgament事务之后,通过调用add方法往容器中添加Fragment实例,显示在手机屏幕上,该方法需要在commit之后才会生效;同样需要commit的是replace,这种方法使用比较少,它是将容器中全部实例移除之后,在添加新的Fragment,因为Fragment不能重复添加,相当于执行remove之后再执行add,重新走一遍生命周期,所以也需要commit。

同一个事务只能被commit一次,commit方法是在装载Fragment容器的Activity调用onSaveInstanceState之前执行,因为onSaveInstanceState() 方法在 onStop() 方法之前执行,也是为了确保在Activity因为某些不可抗性导致进程被杀死,保存当前的状态;如果对Fragment的状态没有具体的要求,可以使用commitAllowingStateLoss()。

在实际的开发过程中,往往会使用add和hide或者show配合使用。Fragment的实例都在内存当中,只有当Fragment实例不存在时,才能添加Fragment到容器当中,所以当Fragment实例存在的时候,只需要调用show方法commit就可以显示Fragment;当需要隐藏该界面时,调用hide方法隐藏。


Fragment添加转场动画
(1)系统自带API

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

setTransition是需要在add或者remove之前调用,使用FragmentTransaction自带的一些动画。

(2)自定义View

@NonNullpublic FragmentTransaction setCustomAnimations(@AnimatorRes @AnimRes int enter,@AnimatorRes @AnimRes int exit) {return setCustomAnimations(enter, exit, 0, 0);}

通过设置setCustomAnimations包括进场和退出的动画

实现导航栏的几种方式相关推荐

  1. Android - 实现导航栏的几种方式

    因为用到binding,所以需要在项目下的build.gradle文件中添加: android {compileSdk 32....buildFeatures{dataBinding = truevi ...

  2. 底部导航栏的几种实现方式

    概述 Android底部导航栏实现方式真的是太多了~在这里仅介绍几种实现方式~建议使用TabLayout +ViewPager ,TabLayout是Android Material Design中的 ...

  3. Android底部导航栏的四种实现

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信,购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  4. 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)

    活动地址:CSDN21天学习挑战赛 1.概述 在定制化开发中,在SystemUI的一些定制功能中,针对默认去掉底部导航栏的方法有好几种,StatusBar和DisplayPolicy.java中api ...

  5. 转载:Android底部导航栏,三种风格和实现

    原文出处 标题:Android底部导航栏,三种风格和实现 作者:阿飞__ 原文链接:Android底部导航栏,三种风格和实现_阿飞__的博客-CSDN博客_android导航栏 一.效果图展示 如果动 ...

  6. Android底部导航栏的三种风格实现

    一.效果图展示 如果动图没有动的话,也可以看下面这个静态图 以下挨个分析每个的实现,这里只做简单的效果展示,大家可以基于目前代码做二次开发. 二.BottomNavigationView 这是 Goo ...

  7. H5移动端div固定到底部实现底部导航条的几种方式

    H5移动端div固定到底部实现底部导航条的几种方式 需求: 需要把导航固定在底部?只能滑动内容,导航菜单固定不动的.效果如下: 这篇文章主要讲解三种实现方案,包括:fixed,absolute,以及c ...

  8. 关于Android系统隐藏导航栏的两种方法

    关于Android系统隐藏导航栏的两种方法 在NXP的imx6q和全志的A40I上试过 1.frameworks/base/core/res/res/values/dimens.xml中修改 < ...

  9. nuxt添加.html,Nuxt内导航栏的两种实现方式

    方式一 | 通过嵌套路由实现 在pages页面根据nuxt的路由规则,建立页面 1. 创建文件目录及文件 根据规则,如果要创建子路由,子路由的文件夹名字,必须和父路由名字相同 所以,我们的文件夹也为i ...

  10. HTML导航栏的四种制作方法,jQuery+CSS3实现四种应用广泛的导航条制作实例详解

    导航条的使用很广,每个网站都会做出具有自己特色的导航条.最近特地去了解了各种类型的导航条,比如具有高亮显示的导航条,中英文互相切换的导航条,具有弹性动画的导航条,甚至是具有摩擦运动动画的导航条(文字下 ...

最新文章

  1. 第一个使用计算机图形学术语,计算机图形学考题
  2. 乔氏西去,敬告各位!
  3. 使用intellij的svn时提示出错: Can't use Subversion command
  4. 青岛农业大学第九届ACM程序设计竞赛
  5. android编译非静态内部类,Android 非静态内部类/匿名类引起的内存泄漏
  6. 【翻译】asp.net core中使用MediatR
  7. php header会重定向吗,php – 可以依靠header()重定向来结束程序流吗?
  8. 判断数组是否有序排列的0831
  9. PPP协议体系的实现
  10. 如何编写开源项目的 README 文档
  11. java winrar_WinRAR5.60官方无广告正式版
  12. Logitech Control Center 3.9.8 特别版 Mac 罗技USB键盘和鼠标管理软件
  13. CEikEdwin 助手
  14. java 箭头符号_箭头符号大全
  15. 电脑锁屏卡死以及任务栏卡死的解决办法
  16. html 背景不填充,CSS之背景的填充范围
  17. apk闪退_解决安卓手机闪退的通用办法!
  18. ObiFruid创建流体,ObiFruid学习笔记
  19. 全国英语计算机等级考试报名费,通知 | 全国大学生英语竞赛计算机等级考试报名...
  20. vue中实现点击复制文本内容之clipboard

热门文章

  1. Latex 学术撰写工具推荐(在线、Windows、Mac、Linux)
  2. UVa 10105 - Polynomial Coefficients
  3. 2018蓝桥杯B组国赛第四题 调手表(bfs)
  4. 【CS106】编译原理笔记4 —— 用普遍性泵引理(Pumping lemma)证明语言的正则性
  5. 电脑里有老版java删不掉,电脑上的一些文件老是删不掉怎么办 win7中经常出现一些文件夹删不掉...
  6. Adobe Photoshop CC2018软件安装教程
  7. DSP软件测试用例,DSP测试实验
  8. 2019数学建模比赛总结
  9. url 与 domain
  10. 华为matebooke能装鸿蒙系统吗,华为matebook e安装系统