学习|Android中JetPack中的几个组件简单使用

原创
2020/03/26 09:00
阅读数 62



学更好的别人,

做更好的自己。

——《微卡智享》




本文长度为2716,预计阅读8分钟




Android JetPack

Android JetPack是一整套的库,工具和指南。可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。


说起来Google对JetPack也是非常的重视,从它的官方主页也可以看出来JetPack在首页上就有一个导航栏了。


整个JetPack中东西也是很多的,最近我也是一直在看其中架构这块,做了个简单的试验,其中Room(官方的ORM库),Lifecycles结合着LiveData/ViewData(生命周期管理工具),用起来后真是感觉好方便。前两天我还在做CameraX的小测试,不过没走通,因为现在非正式版本,等出了我再研究下吧。


简单例子

微卡智享

今天我们就做一个简单的小例子,用到了Lifecycles,LiveData,ViewModel及DataBinding的组合。
新建一个Android的项目起名为myviewmodel,然后在build.gradle中加入
apply plugin: 'kotlin-kapt'
android { kotlinOptions{ jvmTarget = 1.8    }     dataBinding { enabled = true    }}
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0" implementation 'androidx.fragment:fragment-ktx:1.3.0-alpha01'}


上面这块代码我们分开来说



01

DataBinding使用

要使用DataBinding这个我觉得不用多主产了,直接开启这个就行,因为我用的是Kotlin所以上面还要加上kotlin-kapt



02

fragment-ktx的引用

上面这个是引用fragment-ktx的引用,引用这个库时是为了让我们更简单的调用ViewModel,一会儿的代码我会写出不用这个的调用方法,和用这个的方法,当然引用这个时它会提示要使用jvm1.8,所以还需要加上下面的这步。



03

lifecycle-savestate

一般来说,我们用LiveData的话,应用程序在后台切换再回来后,当前的UI界面的数据也会保存的,在新的Android版本后,一般程序到后台一段时间后,系统会直接杀死程序了,我们再重新打开程序,像LiveData的数据也不会保存了,所以加上lifecycle-savestate的话可以保证我们程序在被杀死后重新打开还是存在的(当然,如果是手动用返回按钮退出的,它是不会保存的)



布局文件

布局文件其实很简单,我们在里面就加了一个textView和一个Button



TextViewModel

package com.vaccae.myviewmodel
import android.app.Applicationimport androidx.lifecycle.AndroidViewModelimport androidx.lifecycle.MutableLiveDataimport androidx.lifecycle.SavedStateHandleimport androidx.lifecycle.ViewModel
/** * 作者:Vaccae * 邮箱:3657447@qq.com * 创建时间:2020-03-12 13:58 * 功能模块说明: */class TestViewModel(val handle: SavedStateHandle) : ViewModel() {
val mCount: MutableLiveData<Int> get() { //定义个标签 val title = "count" if (!handle.contains(title)) { handle.set(title, 0) } return handle.getLiveData(title) }
val mShowMsg: MutableLiveData<String> get() { //定义个标签 val title = "showmsg" if (!handle.contains(title)) { handle.set(title, "Vaccae的ViewModel") } return handle.getLiveData(title) }
fun addcount() { //数据加1 mCount.postValue(mCount.value?.plus(1)) //显示数据 mShowMsg.postValue(mShowMsg.value + "\r\n" + mCount.value); }
}
TestViewModel继承自ViewModel,传入时加入了一个SavedStateHandle的参数,就是把我们程序被杀死时保存的数据传入进来,通过set的方式写入,getlivedata的方法读出来。
我们把要保存的数字和显示信息分别用count和showmsg定义为MutableLiveData,把get方法做为从SavedStateHandle中进行读写直接保存。然后再写一个按钮事件,就是点击按钮后直接对LiveData的两个数据进行写入,写入的方式上面也可以看出来,用的postValue。

布局文件中的DataBinding

<?xml version="1.0" encoding="utf-8"?><layout 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">
<data> <variable name="data" type="com.vaccae.myviewmodel.TestViewModel" /> </data>
<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">
<TextView android:id="@+id/tvshow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{data.mShowMsg}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" />
<Button android:id="@+id/button" android:layout_width="102dp" android:layout_height="wrap_content" android:layout_marginTop="239dp" android:text="Button" android:onClick="@{()->data.addcount()}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.54" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.941" />
</androidx.constraintlayout.widget.ConstraintLayout></layout>
使用DataBinding最外层要改为layout,然后数据源在data中进行指定,其中variable中的name就是下面的别名,type就是指向的数据源


双向数据绑定的方式,就和Vue的方式是很像的


Button的事件也是在这里进行绑定的


这样绑好了后,Android会通过apt的方式自动给我们生成了对应的Binding的Class,我们的xml名为activity_main所以生成的名称也是ActivityMainBinding。


MainActivity


package com.vaccae.myviewmodel
import android.app.PictureInPictureParamsimport android.os.Buildimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport androidx.activity.viewModelsimport androidx.annotation.RequiresApiimport androidx.databinding.DataBindingUtilimport androidx.lifecycle.SavedStateHandleimport androidx.lifecycle.SavedStateViewModelFactoryimport androidx.lifecycle.ViewModelProviderimport com.vaccae.myviewmodel.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
// lateinit var viewModel: TestViewModel lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main) //实例化ViewModel的实例// viewModel =// ViewModelProvider(// this,// SavedStateViewModelFactory(application, this)// )[TestViewModel::class.java]
val vm: TestViewModel by viewModels();
//绑定数据 binding.data = vm //观察者模式 binding.lifecycleOwner = this
}
}

上面说我生成的ActivityMainBinding,这里就可以直接引用了,Activity中的代码现在看就很简单了,这里我就只说说fragment的调用方式了。
如果我们开始没有引入 implementation 'androidx.fragment:fragment-ktx:1.3.0-alpha01'的话,正常的调用ViewModel的方式就是我们上面代码屏蔽的
        //实例化ViewModel的实例        var viewModel =            ViewModelProvider(                this,                SavedStateViewModelFactory(application, this)            )[TestViewModel::class.java]
但是我们引入了后直接下面一句话就可以实现了
val vm: TestViewModel by viewModels();
实进我们点开viewModels的类后,一步步下去就可以看到,它里面是帮我们实现了第一种的写法了


这样我们的代码就实现了,程序因为很简单,大家可以自己写一下看看就可以了,这里我就不再展示效果了。




扫描二维码

获取更多精彩

微卡智享




「 往期文章 」


Android通讯库VNanoMsg的1.0.2发布

学习|C++线程与指针结合的小例子

学习|Android中Presentation分屏的简单使用





本文分享自微信公众号 - 微卡智享(VaccaeShare)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部