JectPack架构学习系列三_Databinding

Jetpack Databinding实战
本文详细介绍Jetpack Databinding的使用方法,包括在app.gradle配置、转换布局文件、添加ViewModel、绑定数据及Activity代码编写。通过篮球计数器Demo展示Databinding如何简化界面与数据交互。

继  JectPack架构学习系列二_LiveData 第二章之后的第三章, 这一章我们重点讲讲Databinding. 

当产品经理过来的时候, 说: 小何, 这个在界面不需要显示了, 这个按钮点击不是+1, 是+2 . 

此时,我们是不是有一种想掏出一把长刀, 哈哈哈.

那么, 考虑到之前的模式MVC或者MVP,  当界面发生改变的时候, 修改xml修改界面, 因为Controler(界面)已经和View耦合掉了

, 所以Databinding能帮我们解决这个问题

1  在app.gradle配置

2  在布局文件中, 转换为databinding布局

3  添加ViewModel进布局文件

4  进行控件和ViewModel 数据的绑定

5 Activity代码编写

package com.hzhztech.databindingtest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import com.hzhztech.databindingtest.databinding.ActivityMainBinding
import com.hzhztech.databindingtest.viewmodel.MyViewModel
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    lateinit var myViewModel:MyViewModel
//    lateinit var textView:TextView
//    lateinit var button: Button
    //BuildProject 自动生成的一个类 这是DataBinding方式一,  方式二是直接在xml中绑定数据
    lateinit var binding:ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //方法一需要
//        setContentView(R.layout.activity_main)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
        //方法一不需要
//        textView = findViewById(R.id.textView)
        //方法一不需要
//        button = findViewById(R.id.button)

        myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)

        // 方式一的控件全部在binding中进行管理  ActivityMainBinding是google自动生成的一个类
//        myViewModel.number.observe(this,object :Observer<Int> {
//            override fun onChanged(t: Int?) {
//                binding.textView.text = myViewModel.number.value.toString()
//            }
//        })
//
//        binding.button.setOnClickListener {
//            myViewModel.addNumber()
//        }

        //方式二  换成这个方式 在xml中进行数据的显示和绑定
        binding.data = myViewModel
        binding.lifecycleOwner = this



    }
}

此刻, 就大功告成了. 最后Databinding代码和 一个篮球计数器的Demo奉上:

https://github.com/2402zmybie/DatabindingTest

https://github.com/2402zmybie/Score

### 查找特定ID 'fl_databinding_usage_bottom' 所属的布局或组件 在 Android 开发中,通过数据绑定(Data Binding)技术,可以更方便地管理视图和数据之间的交互。为了查找特定 ID `fl_databinding_usage_bottom` 所属的布局或组件,需要从以下几个方面入手: 1. **检查布局文件** 首先,在项目的布局文件中搜索该 ID。假设该 ID 存在于某个布局文件中,例如 `layout_a.xml` 或其他类似的文件。如果该 ID 被定义为一个 `FrameLayout` 或其他容器组件,则可以通过以下方式定位其所属布局: ```xml <FrameLayout android:id="@+id/fl_databinding_usage_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 如果上述代码片段存在于某个布局文件中,则可以确认该 ID 属于该布局文件中的 `FrameLayout` 组件[^2]。 2. **结合 BaseViewFragment 的实现** 根据提供的 `BaseViewFragment` 类,它通过 `onCreateView` 方法返回一个视图对象,并使用 `DataBindingUtil.inflate` 方法将布局文件与数据绑定进行关联。因此,若 `fl_databinding_usage_bottom` 是由某个继承自 `BaseViewFragment` 的 Fragment 使用,则可以通过以下逻辑推断: ```kotlin abstract class BaseViewFragment<T : ViewDataBinding> : Fragment() { protected var binding: T? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = DataBindingUtil.inflate(inflater, getSubLayoutId(), container, false) return binding!!.root } abstract fun getSubLayoutId(): Int } ``` 在此情况下,`getSubLayoutId()` 方法返回的布局资源 ID 将决定哪个布局文件被加载。如果目标 Fragment 返回了包含 `fl_databinding_usage_bottom` 的布局 ID,则可以进一步确认该 ID 所属的布局文件[^1]。 3. **高级应用:与 ViewModel 结合** 如果 `fl_databinding_usage_bottom` 的使用场景涉及 ViewModel 和数据绑定的结合,则可以通过以下方式验证其所属布局: ```kotlin class MyFragment : BaseViewFragment<MyFragmentBinding>() { override fun getSubLayoutId(): Int = R.layout.my_fragment_layout override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val viewModel = ViewModelProvider(this).get(MyViewModel::class.java) binding.viewModel = viewModel binding.lifecycleOwner = this } } ``` 在此示例中,`my_fragment_layout.xml` 文件可能包含 `fl_databinding_usage_bottom` 的定义。如果确实如此,则可以明确该 ID 属于 `my_fragment_layout.xml` 布局文件[^4]。 4. **动态绑定与条件表达式** 如果布局文件中使用了动态绑定或条件表达式来控制 `fl_databinding_usage_bottom` 的显示或隐藏,则需要检查相关绑定逻辑。例如: ```xml <FrameLayout android:id="@+id/fl_databinding_usage_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="@{viewModel.showBottom ? View.VISIBLE : View.GONE}" /> ``` 在这种情况下,`fl_databinding_usage_bottom` 的可见性由 ViewModel 中的 `showBottom` 属性决定[^4]。 ### 结论 综上所述,`fl_databinding_usage_bottom` 的具体所属布局或组件需要根据项目中的实际布局文件和 Fragment 实现进行分析。通常情况下,可以通过以下步骤定位: - 搜索项目中的布局文件,查找包含该 ID 的 XML 定义。 - 检查相关 Fragment 的 `onCreateView` 或 `getSubLayoutId` 方法,确认加载的布局资源。 - 如果涉及 ViewModel 和数据绑定,则需进一步检查绑定逻辑。 ```kotlin // 示例代码:假设 fl_databinding_usage_bottom 属于 my_fragment_layout.xml class MyFragment : BaseViewFragment<MyFragmentBinding>() { override fun getSubLayoutId(): Int = R.layout.my_fragment_layout } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值