创建 fragment

在此 Codelab 中,您向 AndroidTrivia 应用添加了一个 fragment,在本课的后续两个 Codelab 中您将继续在此应用中执行操作。

  • fragment 是 activity 的模块化部分。
  • fragment 有自己的生命周期,会接收自己的输入事件。
  • 使用 <fragment> 标签在 XML 布局文件中为 fragment 定义布局。
  • 膨胀onCreateView()中 fragment 的布局。
  • 您可以在 activity 运行期间添加或移除 fragment。

定义导航路径

导航组件
如需使用 Android 导航库,您需要执行一些设置:

  • 在模块级build.gradle文件中为 navigation-fragment-ktxnavigation-ui-ktx添加依赖项。

  • 在项目级build.gradle文件中为 navigationVersion添加 ext变量。
    导航目的地是指用户导航到的 fragment、activity 或其他应用组件。导航图定义了从一个导航目的地到下一个导航目的地的可能路径。

  • 如需创建导航图,请创建一个类型为Navigation的新 Android 资源文件。该文件定义了应用中的导航流。该文件位于 res/navigation文件夹中,通常名为 navigation.xml

  • 如需在 Navigation Editor 中查看导航图,请打开 navigation.xml文件,然后点击 Design标签页。

  • 您可以使用 Navigation Editor 向导航图中添加目的地,如 fragment。

  • 如需定义从一个目的地到另一个目的地的路径,请使用导航图创建连接这两个目的地的操作。在 navigation.xml文件中,每个连接都表示为具有 IDaction

导航宿主 fragment 通常名为 NavHostFragment,它充当导航图中 fragment 的宿主:

  • 当用户在导航图中定义的目的地之间移动时,NavHostFragment会换入或换出 fragment 并管理 fragment 返回堆栈。
  • activity_main.xml布局文件中,NavHostFragment由名为 android:name="androidx.navigation.fragment.NavHostFragment"fragment 元素表示。

如需定义当用户点按某个视图(例如按钮)时要显示哪个 fragment,请为该视图设置 onClick 监听器:

  • onClick监听器中,对视图调用findNavController().navigate()
  • 指定通向目的地的 actionID

条件导航是指在一种情况下导航到一个屏幕,而在另一种情况下导航到另一个屏幕。如需创建条件导航,请执行以下操作:

  1. 使用 Navigation Editor 从起始 fragment 到每个可能的目的地 fragment 创建一个连接。
  2. 为每个连接指定唯一的 ID。
  3. View的点击监听器方法中,添加相应的代码以检测条件。然后,对视图调用findNavController().navigate(),并传入相应操作的 ID。

返回按钮
系统的返回按钮通常位于设备的底部。默认情况下,用户按返回按钮后会导航回他们最近查看的屏幕。在某些情况下,您可以控制用户按返回按钮后会转到何处:

  • 在 Navigation Editor 中,您可以使用 Attributes窗格来更改操作的 popUpTo设置。此设置会从返回堆栈中移除目的地,其作用是确定用户按返回按钮后会转到何处。
  • navigation.xml文件中,popUpTo设置显示为 popUpTo属性。
  • 选中popUpToInclusive 复选框时,会将popUpToInclusive 属性设置为true。系统会从返回堆栈中移除直到并包括此目的地在内的所有目的地。
  • 如果操作的 popUpTo 属性设置为应用的起始目的地且popUpToInclusive设置为true,则用户按返回按钮后会直接退出应用。

向上按钮
Android 应用中的屏幕可以有屏幕上的向上按钮,该按钮将显示在应用栏的左上角。(应用栏有时称为操作栏。)向上按钮会根据屏幕之间的层次关系使用户在应用的屏幕中“向上”导航。

导航控制器的 NavigationUI库与应用栏相集成,让用户能够通过点按应用栏中的向上按钮,从应用中的任意位置返回应用的主屏幕。

如需将导航控制器关联到应用栏,请执行以下操作:

  1. onCreate() 中,对 NavigationUI 类调用 setupActionBarWithNavController(),并传入导航控制器:
val navController = this.findNavController(R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this,navController)
  1. 替换 onSupportNavigateUp()方法以在导航控制器中调用 navigateUp()
override fun onSupportNavigateUp(): Boolean {val navController = this.findNavController(R.id.myNavHostFragment)return navController.navigateUp()}
}

选项菜单
选项菜单是指用户从应用栏中点按带有三个垂直点的图标 ...来访问的菜单。如需创建一个选项菜单,让其包含的菜单项显示 fragment,请确保 fragment 具有 ID。然后,定义选项菜单,并为菜单项的 onOptionsItemSelected() 处理程序编码。

  1. 确保 fragment 具有 ID:
  • 向导航图中添加目的地 fragment,并注意 fragment 的 ID。(如果愿意,您可以更改 ID。)
  1. 定义选项菜单:
  • 创建一个类型为 Menu的 Android 资源文件,该文件通常名为 options_menu.xml。该文件存储在 Res > Menu文件夹中。
  • 在设计编辑器中打开 options_menu.xml文件,然后将一个 Menu Item微件从 Palette窗格拖动到菜单。
  • 为方便起见,请将菜单项的 ID 设为与用户点击此菜单项时要显示的 fragment 的 ID 相同。此步骤不是必需操作,但会使为菜单项的 onClick行为编码变得更容易。
  1. 为菜单项的 onClick处理程序编码:
  • 在显示选项菜单的 fragment 或 activity 中,在 onCreateView()中,调用setHasOptionsMenu(true)以启用选项菜单。
  • 实现onCreateOptionsMenu() 以膨胀选项菜单:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {super.onCreateOptionsMenu(menu, inflater)inflater.inflate(R.menu.options_menu, menu)
}
  • 替换 onOptionsItemSelected()方法以在用户点击菜单项时采取适当的操作。以下代码显示了与菜单项具有相同 ID 的 fragment。(仅当菜单项和 fragment 具有完全相同的 ID 值时,此代码才有效。)
override fun onOptionsItemSelected(item: MenuItem): Boolean {return NavigationUI.onNavDestinationSelected(item,requireView().findNavController())|| super.onOptionsItemSelected(item)
}

抽屉式导航栏
抽屉式导航栏是从屏幕边缘滑出的一个面板。用户可以通过两种方式来打开抽屉式导航栏:

  • 在任意屏幕上从起始边缘(通常是左侧边缘)滑动。
  • 使用应用顶部的应用栏中的抽屉式导航栏按钮(三条线)。
    如需向应用中添加抽屉式导航栏,请执行以下操作:
  1. 将依赖项添加到 build.gradle (app)
  2. 确保每个目的地 fragment 都有一个 ID。
  3. 创建抽屉式导航栏的菜单。
  4. 将抽屉式导航栏添加到 fragment 的布局。
  5. 将抽屉式导航栏连接到导航控制器。
  6. 设置应用栏中的抽屉式导航栏按钮。

下面更为详细地介绍了这些步骤。

  1. 将依赖项添加到 build.gradle
  • 抽屉式导航栏是 Material Components for Android 库的一部分。将 Material 库添加到 build.gradle (app) 文件:
dependencies {...implementation "com.google.android.material:material:$supportlibVersion"...
}
  1. 为每个目的地 fragment 指定一个 ID:
  • 如果可以从抽屉式导航栏到达某个 fragment,请在导航图中将其打开,以确保它具有一个 ID。
  1. 创建抽屉式导航栏的菜单:
  • 为抽屉式导航栏菜单创建一个类型为 Menu (通常名为 navdrawer_menu )的 Android 资源文件。这样会在 Res > Menu 文件夹中创建一个新的 navdrawer_menu.xml 文件。
  • 在设计编辑器中,将 Menu Item 微件添加到 Menu
  1. 将抽屉式导航栏添加到 fragment 的布局:
  • 在包含导航宿主 fragment 的布局(它通常是主布局)中,使用 <androidx.drawerlayout.widget.DrawerLayout> 作为根视图。
  • 将一个 <com.google.android.material.navigation.NavigationView> 视图添加到布局中。
  1. 将抽屉式导航栏连接到导航控制器:
  • 打开创建导航控制器的 activity。(主 activity 通常是您在此处想要的 activity。)在 onCreate() 中,使用 NavigationUI.setupWithNavController() 将抽屉式导航栏与导航控制器连接起来:
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
NavigationUI.setupWithNavController(binding.navView, navController)
  1. 设置应用栏中的抽屉式导航栏按钮:
  • 在创建导航控制器的 activity(它通常是主 activity)的 onCreate() 中,将抽屉式导航栏布局作为第三个参数传递给 NavigationUI.setupActionBarWithNavController
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)NavigationUI.setupActionBarWithNavController(this, navController, binding.drawerLayout)```
- 如需将向上按钮与抽屉式导航栏按钮一起使用,请修改  ```onSupportNavigateUp()  ```以返回  ```NavigationUI.navigateUp() ```。将导航控制器和抽屉式导航栏布局传递给  ```navigateUp() ```。
```kotlin
override fun onSupportNavigateUp(): Boolean {val navController = this.findNavController(R.id.myNavHostFragment)return NavigationUI.navigateUp(navController, drawerLayout)
}

Safe Args:

  • 为帮助捕获在将数据从一个 fragment 传递到另一个 fragment 时因键缺失或类型不匹配而导致的错误,请使用名为 Safe Args 的 Gradle 插件。
  • 对于应用中的每个 fragment,Safe Args 插件都会生成相应的 NavDirection 类。您需要将 NavDirection 类添加到 fragment 代码中,然后使用该类在相应 fragment 和其他 fragment 之间传递参数。
  • NavDirection 类表示应用的所有操作的导航。

隐式 intent:

  • 隐式 intent 会声明您的应用希望其他某个应用(例如相机应用或电子邮件应用)代表其执行的操作。
  • 如果多个 Android 应用都可以处理某个隐式 intent,Android 会向用户显示一个选择器。例如,用户在 AndroidTrivia 应用中点按分享图标后,可以选择要用哪个应用来分享游戏结果。
  • 如需构建 intent,您需要声明要执行的操作,例如 ACTION_SEND。
  • 多个 Intent() 构造函数可帮助您构建 intent。

分享功能:

  • 在与好友分享自己的获胜消息时,Intent 操作将为 Intent.ACTION_SEND.
  • 如需为 fragment 添加选项菜单,请在 fragment 代码中将 setHasOptionsMenu() 方法设置为 true。
  • 在 fragment 代码中,替换 onCreateOptionsMenu() 方法以膨胀菜单。
  • 替换 onOptionsItemSelected(),以使用 startActivity() 将 Intent 发送到可以处理它的其他应用。

当用户点按菜单项时,将触发相应 intent,用户会看到 SEND 操作的选择器。

Android kotlin 基础知识codelab Fragment Summary相关推荐

  1. 第一章 kotlin基础知识

    第一章 kotlin基础知识 文章目录 第一章 kotlin基础知识 前言 一.kotlin是什么? 二.kotlin基础知识 1.变量的声明 2.函数定义的几种方式 3.字符串与数字的转换 4.数组 ...

  2. Kotlin学习(一):Kotlin基础知识

    Kotlin学习(一):Kotlin基础知识 定义变量常量 在Kotlin中,定义变量时有以下几点与java不同: 位置不同:在 Kotlin 中,数据类型要放到变量后面,并且用冒号(:)分隔,这正好 ...

  3. android培训总结范文,android培训基础知识总结

    android培训基础知识总结,有需要的朋友可以参考下. android培训之1. Android的四大组件是哪些,它们的作用? Activity:Activity是Android程序与用户交互的窗口 ...

  4. android系统知识,Android系统基础知识百科

    Android系统基础知识百科 2015-12-16 17:58:31 954浏览 Android系统作为一款功能强大的移动计算平台,在保持开放性的同时,必须提供强健的安全保障.Android的系统安 ...

  5. 如何学习kotlin?Kotlin基础知识快速入门

    一 概述 Android 1.5系统中Google 引入了NDK功能,支持使用C和C++语言来进行一些本地化开发. 17年官宣kotlin为安卓一级开发语言:所以对于安卓开发者,学习kotlin是必须 ...

  6. Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)...

    简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...

  7. Android 应用基础知识和应用组件

    应用基础知识 安装到设备后,每个 Android 应用都运行在自己的安全沙箱内: Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户: 默认情况下,系统会为每个应 ...

  8. Android 动画基础知识学习(下)

    1.属性动画 属性动画可以对任意对象的属性进行动画不仅仅是View,动画默认时间间隔是300ms,默认帧率是100ms/帧. 作用:在一个时间间隔内完成对一个对象从属性值到另一个属性值的改变. 三个常 ...

  9. Android Systrace 基础知识(10) - Binder 和锁竞争解读

    本文是 Systrace 系列文章的第十篇,主要是对 Systrace 中的 Binder 和锁信息进行简单介绍,简单介绍了 Binder 的情况,介绍了 Systrace 中 Binder 通信的表 ...

最新文章

  1. Java方法详细介绍
  2. pycharm 查看代码行数_【收藏】提高PyCharm效率的10个小技巧
  3. java如何访问局域网共享文件
  4. ie浏览器修复_继IE之后,微软要彻底放弃它们了...
  5. iOS-状态栏字体颜色【白色】【Xcode9.1】
  6. 属于我的黑名单公司-传播杀意的地方
  7. Linux自动解压部署WEB项目脚本
  8. 【安装sql 2008步骤】
  9. 多个app用同一个签名文件_运动设备和运动APP的合理搭配
  10. 单点登录的CAS实践
  11. TeamTalk编译和部署(一)
  12. JAVA创建内部类对象
  13. 知识图谱 helloword
  14. 微信小程序开发之——开发者工具介绍(1.7)
  15. 如何确定直流电机驱动的 PWM 频率
  16. 竹间智能以AI能力打通医疗链路全流程,让说明书变成“虚拟健康顾问”
  17. 大型网站架构技术演进(史上最全)
  18. C++程序设计作业--坦克大战[分享]
  19. 微信扫码下载app的前端界面代码
  20. android jmf,基于JMF与Android的无线视频监控系统的设计与实现

热门文章

  1. Oracle查询工资前三的员工信息
  2. Revit插件快速提高建模的效率,分别都有那种功能revit插件
  3. mysql MDL锁如何解决_理解MySQL的MDL元数据锁
  4. ScratchJr-ScratchJr介绍
  5. VIsio| 使用Viso绘制ER图
  6. 短信从iphone迁移到android,将iPhone短信完整迁移到安卓系统上的方法
  7. 关于SUMO里如何通过Python进行车流量控制
  8. 搜索引擎排名优化方法
  9. 技术三板斧:技术规划、架构和管理!
  10. 从‘0’开始完成一个阻抗分析仪(初篇——原理讲解)