gpt4 book ai didi

Android ViewBinding 与 CustomView

转载 作者:行者123 更新时间:2023-12-03 09:52:12 26 4
gpt4 key购买 nike

我想用自定义 View 试用 ViewBinding,例如:

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

layout_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>

主要 Activity
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 中,我可以使用绑定(bind)找到 MyCustomView 但我无法进一步找到 @id/line1@id/line2在我的自定义 View 中。在这种情况下,是否可以仅使用 ViewBinding 还是必须使用 findViewById还是 Kotlin 合成的??

提前致谢。

最佳答案

ViewDataBinding.inflate不会在自定义 View 中生成 subview 访问器。

因此,您无法触摸 第 1 行( TextView )通过仅使用 ViewDataBinding .

如果您不想使用 findViewByIdkotlin synthetic , MyCustomView还需要申请ViewDataBinding .尝试如下。

自定义 View

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
}

主要 Activity
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"
}
}

关于Android ViewBinding 与 CustomView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60425304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com