从 XML 膨胀时自定义 Android 视图类型错误
Custom Android view has wrong type when inflating from XML
我有一个自定义视图,它扩展了 LinearLayout
:
class MyCustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {
private val binding = MyCustomViewBinding.inflate(LayoutInflater.from(context), this, true)
// ...
}
我需要定义一个自定义包装器(类似于 TextInputLayout),它可以包含一个子 MyCustomView
对象并具有特殊的逻辑来膨胀它。所以我希望能够如下定义 XML 中的视图:
<com.example.MyCustomWrapper
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.example.MyCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.example.MyCustomWrapper>
为此,我覆盖了 addView()
方法(类似于 https://android.googlesource.com/platform/frameworks/support/+/81fdc55/design/src/android/support/design/widget/TextInputLayout.java#140 ),该方法在 XML inflation:
期间调用
class MyCustomWrapper @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : ConstraintLayout(context, attrs) {
private val binding = MyCustomWrapper Binding.inflate(LayoutInflater.from(context), this, true)
override fun addView(child: View?) {
if (child is MyCustomView) {
// custom logic
} else {
super.addView(child)
}
}
}
不幸的是,它不起作用:条件 child is MyCustomView
始终为假,在调试器中,子项仅键入为 LinearLayout
。任何想法,如何解决这个问题?
你必须覆盖
override fun addView(child: View?, params: ViewGroup.LayoutParams?) {
...
}
addView(child: View?)
仅针对您的 MyCustomWrapperBinding
调用
我有一个自定义视图,它扩展了 LinearLayout
:
class MyCustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {
private val binding = MyCustomViewBinding.inflate(LayoutInflater.from(context), this, true)
// ...
}
我需要定义一个自定义包装器(类似于 TextInputLayout),它可以包含一个子 MyCustomView
对象并具有特殊的逻辑来膨胀它。所以我希望能够如下定义 XML 中的视图:
<com.example.MyCustomWrapper
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.example.MyCustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.example.MyCustomWrapper>
为此,我覆盖了 addView()
方法(类似于 https://android.googlesource.com/platform/frameworks/support/+/81fdc55/design/src/android/support/design/widget/TextInputLayout.java#140 ),该方法在 XML inflation:
class MyCustomWrapper @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : ConstraintLayout(context, attrs) {
private val binding = MyCustomWrapper Binding.inflate(LayoutInflater.from(context), this, true)
override fun addView(child: View?) {
if (child is MyCustomView) {
// custom logic
} else {
super.addView(child)
}
}
}
不幸的是,它不起作用:条件 child is MyCustomView
始终为假,在调试器中,子项仅键入为 LinearLayout
。任何想法,如何解决这个问题?
你必须覆盖
override fun addView(child: View?, params: ViewGroup.LayoutParams?) {
...
}
addView(child: View?)
仅针对您的 MyCustomWrapperBinding