专栏首页微卡智享学习|Android中JetPack中的几个组件简单使用

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

本文长度为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.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import 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.PictureInPictureParams
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.annotation.RequiresApi
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.SavedStateViewModelFactory
import androidx.lifecycle.ViewModelProvider
import 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的类后,一步步下去就可以看到,它里面是帮我们实现了第一种的写法了

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

本文分享自微信公众号 - 微卡智享(VaccaeShare),作者:Vaccae

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学习|Android使用TTS语音合成

    所谓活到老,学到老,本篇开始我写的Android代码尽量都转为Android指定的官方语言Kotlin,一是技多不压身,二是Kotlin的语法与我接触的第一门开...

    Vaccae
  • Android的RecyclerView不规则Grid显示

    前面我们有介绍RecyclerView的使用,详见《Android中RecyclerView嵌套RecyclerView》,这一篇我们来讲讲RecyclerVi...

    Vaccae
  • 学习|Android属性动画的基础介绍

    最近在产品迭代中发现有些系统的提示不够醒目,让用户容易忽略,为了不影响原来的界面布局,所以考虑到用动画的效果来加大提醒的效果,正好以前也没用到过动画这块,所谓边...

    Vaccae
  • APP 引导页、欢迎页运用

    在实际生活中我们使用的每一款App都会有一个引导页和欢迎页面,这两个页面主要是增加用户体验,引导页是在你第一次安装该APP的时候显示的,而欢迎页你你每次进入应用...

    晨曦_LLW
  • python框架flask入门之路由及简单实现方法

    简单来说,路由就是一个url到函数的映射,通过路由规则,可以使得url被指定的函数进行处理解析。

    砸漏
  • Android简易电话拨号器实例详解

    我是基于安卓4.2.2开发的,下面是我写的MainActivity.java代码:

    砸漏
  • Android仿QQ首页ListView左滑置顶、删除功能

    实现源码:package com.duguang.baseanimation.ui.listivew.deletelistview;

    砸漏
  • Android开发中Listview动态加载数据的方法示例

    本文实例讲述了Android开发中Listview动态加载数据的方法。分享给大家供大家参考,具体如下:

    砸漏
  • Android编程实现的首页左右滑动切换功能示例

    本文实例讲述了Android编程实现的首页左右滑动切换功能。分享给大家供大家参考,具体如下:

    砸漏
  • 视频直播系统源码,图片叠加

    yunbaokeji柯基

扫码关注云+社区

领取腾讯云代金券