【Android笔记】Jetpack常用组件与好文

243 阅读3分钟

官网与基本说明

image.png

一、 ViewBinding和DataBinding

1、 原理,用法,多场景,封装:findViewById不香吗?为什么要把简单的问题复杂化?为什么要用DataBinding

  1. DataBinding PopWindow的使用方式

2、 BinderAdapter

  1. Android Jetpack组件之BindingAdapter详解
  • 优先级与使用原理;
  • 自定义多属性,若xml中想用app为头进行使用,binder方法头别带app(忽略命名空间);
  • Kotlin使用@JvmStatic标注静态方法。

class UserAdapter(users: MutableList<User>, context: Context) :
    RecyclerView.Adapter<UserAdapter.MyHolder>() {

    class MyHolder(val binding: TextItemBinding) : RecyclerView.ViewHolder(binding.root)
    
    private var users: MutableList<User> = arrayListOf()
    private var context: Context
    
    init {
        this.users = users
        this.context = context
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {
        val inflater = LayoutInflater.from(context)
        val binding: TextItemBinding = DataBindingUtil.inflate(inflater, R.layout.text_item, parent, false)
        return MyHolder(binding)
    }

    override fun onBindViewHolder(holder: MyHolder, position: Int) {
        holder.binding.user = users[position]
        holder.binding.executePendingBindings()
    }

    override fun getItemCount() = users.size
}

3、include

  • 高版本通过ID访问就行了【版本参考风聆-lifecycle】
  • 低版本手动加到root里,前提有merge,太操蛋,还是别用了
//素质二连
lateinit var homeTopBinding: LayoutHomeTopToolsBinding

homeTopBinding = LayoutHomeTopToolsBinding.bind(mBindView.root)

4、有种情况是这样,使用include时,没有指定那个binding/或者有同名文件/view,他不知道是那个;需加个强转,报黄线属正常情况,运行正常就OK;

二、 Viewmodel与LiveData

1、 viewmodel建立,观察者模式: 学会使用LiveData和ViewModel,我相信会让你在写业务时变得轻松🌞

  • 同一个Activity下的两个Fragment共享一个ViewModel
  • 这种写法对象始终不为null,未post时value 为null: public MutableLiveData<Music> music = new MutableLiveData<>();
  • SingleLiveEvent:如果有多处onserve,使用这个的话,首个接受到的才会执行;

2、Xml中使用Binding


<data>
       <import type="android.view.View" />
           <variable
            name="vm"
            type="com.kakusummer.utils.viewmodel.MusicViewModel" />
</data>       
        <view
        android:visibility="@{(!vm.isHighRes?View.GONE:View.VISIBLE}"
        />	 

3、转义字符

  • 清单文件里&& 与&amp取代

4、 1、如果在Activity发起变更,在多个fragment都设置了观察者,但会crash

  • 第一个fragment可接收,点击第二个fragment,此时会打印第二个fragment中也接收到了
  • vm?.listVideoMessage?.observe(this)

2、 对直接观察的数据源改动才会触发观察者

//刚开始赋值的源头也是没用的
Log.d("yeTest", "deleteMusic 111: "+musicListViewModel.musicList.value?.size )
//MessageMusic.musicListAll?.remove(bean)
musicListViewModel.musicList.value?.remove(bean) 改变指引也无效
//musicListViewModel.setMusicList(MessageMusic.musicListAll)
Log.d("yeTest", "deleteMusic 111333: "+musicListViewModel.musicList.value?.size )

3、 使用SingleLiveEvent保证只有一处触发监听

三、Room

1、重学Android Jetpack(四)之—Room基本使用详解

  • 比较完整,包含数据库升级

2、Android 数据存储(四)-Room - 掘金 (juejin.cn)

  • 建立ben类的讲解比较详细

四、BinderAdapter

  • xml绑定对象,根据对象状态进行UI变动

1、Android Jetpack组件之BindingAdapter详解

  • 自己定义的属性代码里不能动态改的,

2、好用的写法 把bean类改成这样,用post设置的话可以动态绑的view更新

    @SerializedName("music_id")
    private int musicId;


    @SerializedName("music_id")
    public ObservableInt musicIdObservable = new ObservableInt(0);

3、实际运用补充:

  • binderadapter中写多个参数只会执行一次,等全拿到了之后才执行
  • 代码中可以通过 binding.episodesContent = newContent的方式手动刷对应的,viewmodel的post同理

五、Navigation

  • 新的绑定与切换fragment方式

1、重学Android Jetpack(一)之-Navigation

2、Navigation — 这么好用的导航框架你确定不来看看?

  • xml连线生成对应的跳转id
  • 点击事件触发时调用连线生成的跳转id即可

六、WorkManger

  • WorkManager 适用于需要可靠运行的工作,即使用户导航离开屏幕、退出应用或重启设备也不影响工作的执行。
  • 桌面小部件中使用WorkManager,实际上WorkManager主要用于处理后台任务,而桌面小部件(widget)通常用于在主屏幕上展示信息或提供交互。

重学Android Jetpack(三)之—WorkManger

七、Camera

1、camera2:自定义程度高,但使用较为复杂;

2、camerax:使用简单,但自定义程度低,Android官方demo挺好的;

  1. 开始使用Android CameraX

应用场景

一、Binding

1、使用include时可能会爆红

原因是当前只声明的本体layout的binding,静态编译的时候编译器不知道找对应的那个Binding,手动加一下就好了

image.png