是时候更新手里的武器了—Jetpack架构组件简析( 五 )

在res文件夹下新建navigation目录 , 并新建my_nav.xml 文件 。配置好每个Fragment , 其中:

  • app:startDestination 属性代表一开始显示的fragment
  • android:name 属性代表对应的Fragment路径
  • action 代表该Fragment存在的跳转事件 , 比如myFragment1可以跳转myFragment2 。
  1. 修改Activity的布局文件:
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/nav_host_fragment"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:defaultNavHost="true"app:navGraph="@navigation/my_nav" /></androidx.constraintlayout.widget.ConstraintLayout>可以看到 , Activity的布局文件就是一个fragment控件 , name为NavHostFragment , navGraph为刚才新建的mynavigation文件 。
5)配置完了之后 , 就可以设置具体的跳转逻辑了 。
override fun onClick(v: View) {//不带参数 v.findNavController().navigate(R.id.action_blankFragment_to_blankFragment2)//带参数var bundle = bundleOf("amount" to amount)v.findNavController().navigate(R.id.confirmationAction, bundle)}//接收数据tv.text = arguments?.getString("amount")需要注意的是 , 跳转这块官方建议用Safe Args 的Gradle 插件 , 该插件可以生成简单的 object 和 builder类 , 以便以类型安全的方式浏览和访问任何关联的参数 。这里就不细说了 , 感兴趣的可以去官网看看
Room
Room 持久性库在 SQLite 的基础上提供了一个抽象层 , 让用户能够在充分利用 SQLite 的强大功能的同时 , 获享更强健的数据库访问机制 。
所以Room就是一个数据库框架 。问题来了 , 市面上那么多数据库组件 , 比如ormLite , greendao等等 , 为什么google还要出一个room , 有什么优势呢?
  • 性能优势 , 一次数据库操作主要包括:构造sql语句—编译语句—传入参数—执行操作 。ORMLite主要在获取参数属性值的时候 , 是通过反射获取的 , 所以速度较慢 。GreenDao在构造sql语句的时候是通过代码拼接 , 所以较慢 。Room是通过接口方法的注解生成sql语句 , 也就是编译成字节码的时候就生成了sql语句 , 所以运行起来较快 。
  • 支持jetpack其他组件(比如LiveData , Paging)以及RxJAVA , 这就好比借助了当前所在的优势环境 , 就能给你带来一些得天独厚的优势 。当然实际使用起来也确实要方便很多 , 比如liveData结合 , 就能在数据查询后进行自动UI更新 。
既然Room这么优秀 , 那就用起来吧 。Room的接入主要有三大点:DataBase、Entity、Dao 。分别对应数据库 , 表和数据访问 。
1)首先导入库:
apply plugin: 'kotlin-kapt'dependencies {def room_version = "2.2.5"implementation "androidx.room:room-runtime:$room_version"kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor// optional - Kotlin Extensions and Coroutines support for Roomimplementation "androidx.room:room-ktx:$room_version"// optional - RxJava support for Roomimplementation "androidx.room:room-rxjava2:$room_version"}2)建立数据库类 , 声明数据库表成员 , 数据库名称 , 数据库版本 , 单例等等
@Database(entities = arrayOf(User::class), version = 1)abstract class UserDb : RoomDatabase() {abstract fun userDao(): UserDaocompanion object {private var instance: UserDb? = null@Synchronizedfun get(context: Context): UserDb {if (instance == null) {instance = Room.databaseBuilder(context.applicationContext,UserDb::class.java, "StudentDatabase").build()}return instance!!}}}3)建表 , 可以设置主键 , 外键 , 索引 , 自增等等


推荐阅读