Android核心知识简记

视图绑定

视图绑定的作用

  • 视图绑定: 为某个模块启用视图绑定功能后,系统会为该模块中包含的每个 XML 布局文件生成一个绑定类。每个绑定类均包含对根视图以及具有 ID 的所有视图的引用。系统会通过以下方式生成绑定类的名称:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。

视图绑定的使用方式

  1. 在应用的build.gradle的android的大括号中新增
    buildFeatures {
        viewBinding true
    }
  1. 在Activity中进行视图绑定(假设视图对应的xml文件名为:result_profile.xml)
    private lateinit var binding: ResultProfileBinding

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        binding = ResultProfileBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
    }
    
  1. 在Fragment中使用视图绑定(假设视图对应的xml文件名为:result_profile.xml)
    private var _binding: ResultProfileBinding? = null
    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = ResultProfileBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
    }

    override fun onDestroyView() {
        super.onDestroyView()
        // Fragment 的存在时间比其视图长。请务必在 Fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用。
        _binding = null
    }
    

ViewModel

ViewModel作用

  • ViewModel: ViewModel 是视图中显示的应用数据的模型。模型是负责处理应用数据的组件,能够让应用遵循架构原则,通过模型驱动界面。ViewModel 存储应用相关的数据,这些数据不会在 Android 框架销毁并重新创建 activity 或 fragment 时销毁。在配置更改期间会自动保留 ViewModel 对象(不会像销毁 activity 或 fragment 实例一样将其销毁),以便它们存储的数据立即可供下一个 activity 或 fragment 实例使用。

ViewModel使用

  1. 在应用的build.gradle中引入依赖
// ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
  1. 创建对应类
class GameViewModel : ViewModel() {
}
  1. 将ViewModel附加到Activity/Fragment
private val viewModel: GameViewModel by viewModels()

LiveData

LiveData作用

  • LiveData 可存储数据;LiveData 是一种可存储任何类型的数据的封装容器。
  • LiveData 是可观察的,这意味着当 LiveData 对象存储的数据发生更改时,观察器会收到通知。
  • LiveData 具有生命周期感知能力。当您将观察器附加到 LiveData 后,观察器就会与 LifecycleOwner(通常是 activity 或 fragment)相关联。LiveData 仅更新处于活跃生命周期状态(例如 STARTED 或 RESUMED)的观察器。您可以在此处详细了解 LiveData 和观察。

LiveData使用

  1. 在应用的build.gradle中引入依赖
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
  1. 一般是在ViewModel中定义被LiveData封装的对象
private val _currentScrambledWord = MutableLiveData<String>()
val currentScrambledWord: LiveData<String>
   get() = _currentScrambledWord
  1. 在Activity/Fragment中引入对应的ViewModel对象
// Observe the currentScrambledWord LiveData.
viewModel.currentScrambledWord.observe(viewLifecycleOwner) { newWord ->
}

数据绑定

数据绑定作用

  • 数据绑定使用声明性格式将布局中的界面组件绑定到应用中的数据源,简而言之,数据绑定就是将数据(从代码)绑定到视图 + 视图绑定(将视图绑定到代码)

数据绑定使用

  1. 在 build.gradle(Module) 文件中的 buildFeatures 部分下,启用 dataBinding 属性
buildFeatures {
   dataBinding = true
}
  1. 若要在任何 Kotlin 项目中使用数据绑定,应当应用 kotlin-kapt 插件
plugins {
   id 'kotlin-kapt'
}
  1. 将布局文件转换为数据绑定布局,数据绑定布局文件略有不同,以根标记 开头,后跟可选 元素和 view 根元素。此 view 元素就是非绑定布局文件中的根。
<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>
   </data>
   <ScrollView
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <androidx.constraintlayout.widget.ConstraintLayout
         ...
       </androidx.constraintlayout.widget.ConstraintLayout>
   </ScrollView>
</layout>
  1. 在 Fragment 中的 onCreateView() 方法开头,将 binding 变量的实例化。
// 成员变量声明
private lateinit var binding: GameFragmentBinding
// 放在onCreateView()中
binding = DataBindingUtil.inflate(inflater, R.layout.game_fragment, container, false)
  1. 在Activity中的onCreate()方法,将将 binding 变量实例化
// 成员变量声明
private lateinit var actBinding: ActivityMainBinding
// 放在onCreate()中
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
  1. 若想要在布局文件中添加属性,以访问viewModel中的应用数据,需要先在布局文件中初始化布局变量,在 game_fragment.xml 中的 标记内添加名为 的子标记内,声明一个名为 gameViewModel、类型为 GameViewModel 的属性。您将使用此属性将 ViewModel 中的数据绑定到布局
<data>
   <variable
       name="gameViewModel"
       type="com.example.android.unscramble.ui.game.GameViewModel" />
</data>
  1. 在 GameFragment 中的 onViewCreated() 方法开头,初始化布局变量 gameViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
   super.onViewCreated(view, savedInstanceState)
   binding.gameViewModel = viewModel
}
  1. LiveData 是生命周期感知型可观察对象,因此您必须将生命周期所有者传递给布局。在 GameFragment 中的 onViewCreated() 方法内,在绑定变量的初始化下方添加以下代码。
   binding.lifecycleOwner = viewLifecycleOwner
  1. 后续的布局中的参数绑定方式参考:使用绑定表达式
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值