Navigation

    • 前言
  • Navigation
    • Activity 多个Fragment的情况
    • Fragment 嵌套 Fragment
  • 参考地址

前言

Jetpack 是一个丰富的组件库,它的组件库按类别分为 4 类,分别是架构(Architecture)、界面(UI)、 行为(behavior)和基础(foundation)。

每个组件都可以单独使用,也可以配合在一起使-用。每个组件都给用户提供了一个标准, 能够帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者能够集中精力编写重要的业务代码。

Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,是管理fragment跳转的框架,如果应用只有一个Activity,那么这个框架将是首选。

navigation 在车机应用上,用的比较多。

Navigation

Activity 多个Fragment的情况

1.引入依赖

    implementation 'androidx.navigation:navigation-fragment:2.3.5'implementation 'androidx.navigation:navigation-ui:2.3.5'

2.写几个我们需要放在首页的碎片

BaseFragment

public abstract class BaseFragment extends Fragment {public String TAG = this.getClass().getSimpleName();@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return inflater.inflate(bindLayout(), container, false);}/*** 添加布局** @return 返回布局的资源id*/protected abstract int bindLayout();}

首页

public class MainFragment extends BaseFragment {@Overrideprotected int bindLayout() {return R.layout.fragment_main;}}

==

页面只要继承 Fragment 即可,无过多要求。

3.搞个navigation的基础的配置文件

res 下新建navigation路径,新建文件nav_register.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_register"app:startDestination="@id/mainFragment"><fragmentandroid:id="@+id/mainFragment"android:name="com.yoshin.ble.service.fragment.MainFragment"android:label="首页"tools:layout="@layout/fragment_main"></fragment><fragmentandroid:id="@+id/secondFragment"android:name="com.yoshin.ble.service.fragment.SecondFragment"android:label="第二页"tools:layout="@layout/fragment_second" /><fragmentandroid:id="@+id/meFragment"android:name="com.yoshin.ble.service.fragment.MeFragment"android:label="这是我的页面"tools:layout="@layout/fragment_second" /></navigation>

4.Activity的资源文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"tools:context=".MainActivity"><fragmentandroid:id="@+id/nav_register_frag"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"app:navGraph="@navigation/nav_register" /><RadioGroupandroid:id="@+id/radio_group"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintBottom_toBottomOf="parent"><RadioButtonandroid:id="@+id/btn_page_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:checked="true"android:gravity="center"android:text="页面1"android:textColor="@color/black" /><RadioButtonandroid:id="@+id/btn_page_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:gravity="center"android:text="页面2"android:textColor="@color/black" /><RadioButtonandroid:id="@+id/btn_page_3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:gravity="center"android:text="页面3"android:textColor="@color/black" /></RadioGroup></androidx.constraintlayout.widget.ConstraintLayout>

5.MainActivity内的代码

public class MainActivity extends BaseActivity {private NavHostFragment navHostFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_register_frag);RadioGroup radioGroup = findViewById(R.id.radio_group);radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {LogUtil.i(TAG, "onCheckedChanged ==" + checkedId);switch (checkedId) {case R.id.btn_page_1:navHostFragment.getNavController().navigate(R.id.mainFragment);break;case R.id.btn_page_2:navHostFragment.getNavController().navigate(R.id.secondFragment);break;case R.id.btn_page_3:navHostFragment.getNavController().navigate(R.id.meFragment);break;default:break;}}});}}

Fragment 嵌套 Fragment

续上面代码写的,我们要在MainFragment中再添加两个Fragment

1.新建 Fragment

和上面一样,没有什么出奇的

public class AllScanFragment  extends BaseFragment {@Overrideprotected int bindLayout() {return R.layout.fragment_all_scan;}
}

2.创建第二份 navigation文件,这份文件要用在mainFragment的layout文件中

nav_register_frag_main

<?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_register"app:startDestination="@id/allScanFragment"><fragmentandroid:id="@+id/allScanFragment"android:name="com.yoshin.ble.service.fragment.main.AllScanFragment"android:label="首页-首页"tools:layout="@layout/fragment_all_scan" /><fragmentandroid:id="@+id/paramScanFragment"android:name="com.yoshin.ble.service.fragment.main.ParamScanFragment"android:label="首页-第二页"tools:layout="@layout/fragment_param_scan" /></navigation>

3.MainFragment的layout文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"><fragmentandroid:id="@+id/nav_register_frag_main"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"app:navGraph="@navigation/nav_register_frag_main" /><RadioGroupandroid:id="@+id/radio_group"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintTop_toTopOf="parent"><RadioButtonandroid:id="@+id/btn_page_1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:checked="true"android:gravity="center"android:text="全部扫描"android:textColor="@color/black" /><RadioButtonandroid:id="@+id/btn_page_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@null"android:gravity="center"android:text="条件扫描"android:textColor="@color/black" /></RadioGroup></androidx.constraintlayout.widget.ConstraintLayout>

4.MainFragment中的代码

public class MainFragment extends BaseFragment {@Overrideprotected int bindLayout() {return R.layout.fragment_main;}private NavHostFragment navHostFragment;@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);navHostFragment = (NavHostFragment) getChildFragmentManager().findFragmentById(R.id.nav_register_frag_main);RadioGroup radioGroup = view.findViewById(R.id.radio_group);radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {LogUtil.i(TAG, "onCheckedChanged ==" + checkedId);switch (checkedId) {case R.id.btn_page_1:navHostFragment.getNavController().navigate(R.id.allScanFragment);break;case R.id.btn_page_2:navHostFragment.getNavController().navigate(R.id.paramScanFragment);break;default:break;}}});}}

5.效果

参考地址

转自 Android Jetpack架构全家桶,学完可从零搭建一个Android项目架构:http://px.sxjnk.cn/enjoy/advertorial/article_6

每天记录学习的新知识 :Navigation相关推荐

  1. 每天记录学习的新知识:开源代码是否可以商用在项目中?

    开源代码是否可以商用? 是否可以商用? 如何查看许可证是哪个? 什么是 Apache License 2.0 ? 如何使用开源代码? 1.根路径添加 LICENSE 文件 2.根路径添加 NOTICE ...

  2. 每天记录学习的新知识 :WebView介绍以及基本使用和方法

    WebView介绍以及基本使用和方法 一.简介 二.调用: 三.方法介绍 3.1 WebView状态控制 3.2 WebView销毁和清理 3.3 WebView网页切换 3.4 WebView的回调 ...

  3. 每天记录学习的新知识 : Disposable和CompositeDisposable

    CompositeDisposable 一.Disposable 1.简介 2.调用 2.1.主动解除订阅 2.2.查询是否解除订阅 true 代表 已经解除订阅 2.3.栗子 2.4.取消订阅的操作 ...

  4. 每天记录学习的新知识:圆的运算公式

    前言: 对于圆的运算,忘记得很彻底,回顾一下. 公式: 圆的周长,C=2πr 或 C=πd 圆的面积,S=πr2=πd2/4 弧度 1弧度约为57.3°,即57°17'44.806'',1°为π/18 ...

  5. 每天记录学习的新知识:ContentResolver

    ContentResolver 一.用途 二.方法 三.使用 1.查询 2.插入 3.数据刷新通知 4.可以用于监听系统的数据变化 参考地址 一.用途 ContentResolver直译为内容解析器, ...

  6. 每天记录学习的新知识 : gilde 和 picasso的区别

    区别和联系 1.Context 不同 Picasso.with(只能传入上下文) . Glide.with,后面可以传入上下文,activity实例,FragmentActivity实例,Fragem ...

  7. 每天记录学习的新知识:利用高德地图绘制历史路线

    前提: App需要展示行程路线,这里用的是高德地图的Api 绘制路线: 首先下载了官方提供的 AMap3DDemo ,运行后找到 case 多彩线绘制,仿照它基本上可以实现路线绘制. 绿色位置请忽略. ...

  8. 【每天学习一点新知识】中间人攻击是什么

    目录 中间人攻击介绍 中间人攻击原理 1. ARP欺骗 2. DNS欺骗 防御方法 中间人攻击介绍 中间人攻击(man-in-the-middle attack, abbreviated to MIT ...

  9. 每天学习一点新知识(一)——Unity开发游戏的拆包

    每天学习一点新知识(一)--Unity开发游戏的解包 用了CSDN有一段时间了,但一直都没有写过blog,只是在输入,没有输出.而且一直主要都是在查一些作业.题解什么的,还是希望自己能够多学到一些新东 ...

最新文章

  1. Jquery和PHP Ajax JSON
  2. 收集到的一些网络工程师面试题 和大家分享下
  3. Hadoop安装教程_分布式集群
  4. type=radio增加onclick没有效果_张启东:如何有效增强KTV音响效果的立体感?
  5. Cracking the coding interview--Q1.4
  6. php json 不转义,php json_encode中文不转义
  7. [Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]
  8. android support v7 v13,Android support V3 v7 v13的区别
  9. Git 不能只会 pull 和 push,试试这5条提高效率的命令吧!
  10. linux驱动编写(触摸屏驱动)
  11. 自动驾驶感知系统(图)侵删
  12. springboot统一异常处理及返回数据的处理
  13. unity中Rotation * Position的意义
  14. 怎么样学好c++_怎么样
  15. Linux有问必答:如何在Linux命令行中刻录ISO或NRG镜像到DVD
  16. JavaScript设计模式与开发实践
  17. 北京航空航天大学计算机学院保研,北京航空航天大学计算机学院(专业学位)计算机技术保研...
  18. 使用web设计器制作图表报表
  19. 转载:SolidWorks 2014 安装完成破解成功,用过一段时间后提示重新激活(win10系统)...
  20. Mobile TV Vs IPTV

热门文章

  1. 移动护理C位出道,ip中的vip。
  2. 投色子抽奖游戏 html,使用jQuery实现的掷色子游戏动画效果
  3. openjpeg:解决静态链接时未定义引用错误:undefined reference to `__imp_opj_xxxxxxx'
  4. LimeSDR 上手指南
  5. excel怎么转换成左上角带绿色小三角的文本格式
  6. 反射型xss和Dom型xss区别
  7. OA 也有天下第一的座椅?
  8. 中国第一封email
  9. android环信登录成功但是收不到消息,Android环信即时通信遇到的问题及解决方法...
  10. 格斗java华娱_华娱水滸2-武林至尊