繁体   English   中英

带有自定义视图的 Android ViewBinding

[英]Android ViewBinding with CustomView

我想使用自定义视图来试用 ViewBinding,例如:

MainActivity <=> layout_main.xml
MyCustomView <=> layout_my_custom_view.xml

布局_main.xml

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.example.myapplication.MyCustomView
            android:id="@+id/custom_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</FrameLayout>

layout_my_custom_view.xml

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/line1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Line1" />

        <View
            android:id="@+id/divider"
            android:layout_width="match_parent"
            android:layout_height="2dp"
            android:background="#2389bb" />

        <TextView
            android:id="@+id/line2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Line2" />
</LinearLayout>

主要活动

class MainActivity : AppCompatActivity() {

    private lateinit var binding: LayoutMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = LayoutMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.customView.line1.text = "Hello"
        binding.customView.line2.text = "World"
    }
}

在我的 MainActivity 中,我可以使用绑定来查找 MyCustomView,但我无法在 MyCustomView 中进一步找到@id/line1@id/line2 在这种情况下,是否可以仅使用 ViewBinding 还是必须使用findViewById或 Kotlin 合成?

提前致谢。

ViewDataBinding.inflate不会在自定义视图中生成子视图访问器。

因此,您不能仅通过使用ViewDataBinding来触摸line1(TextView)

如果您不想使用findViewByIdkotlin synthetic ,则MyCustomView还需要应用ViewDataBinding 尝试如下。

自定义视图

class MyCustomView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
    private val binding =
        CustomLayoutBinding.inflate(LayoutInflater.from(context), this, true)

    val line1
        get() = binding.line1

    val line2
        get() = binding.line2
}

主要活动

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
    setContentView(binding.root)

    with(binding.customView) {
        line1.text = "Hello"
        line2.text = "World"
    }
}

另一种方法是返回CustomView绑定object

class CustomView constructor(context: Context, attrs: AttributeSet?) : 
    ConstraintLayout(context, attrs){
                
        private val _binding: CustomViewBinding = CustomViewBinding.inflate(
                        LayoutInflater.from(context), this, true)
                
                val binding get() = _binding    
        }

然后在您的ActivityFragment

binding.customView.binding.line1?.text = "Hello"
binding.customView.binding.line2?.text = "World"

您可以分享您的 MainActivity 课程吗?

您如何尝试引用视图?

理想情况下,您应该可以使用findViewByIdKotlin synthetic来引用/访问视图。

我相信您可以在自定义视图中使用 setter。 由于 ViewBinding 为您的主布局生成绑定类,它应该返回给您 CustomView 类。 因此,您可以使用刚刚编写的 setter 来更改文本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM