官网与基本说明
一、 ViewBinding和DataBinding
1、 原理,用法,多场景,封装:findViewById不香吗?为什么要把简单的问题复杂化?为什么要用DataBinding
2、 BinderAdapter
- 优先级与使用原理;
- 自定义多属性,若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、转义字符
- 清单文件里&& 与&取代
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挺好的;
应用场景
一、Binding
1、使用include时可能会爆红
原因是当前只声明的本体layout的binding,静态编译的时候编译器不知道找对应的那个Binding,手动加一下就好了