自定义ViewGroup中的数据指标给出错误

发布于 2025-02-04 12:45:27 字数 4606 浏览 3 评论 0原文

tldr; 我收到一个错误说:

无法恢复活动{... mainActivity}:java.lang.nullpointerexception:尝试调用虚拟方法'void androidx.appcompat.widget.appcompattextview.settag(java.lang.object) /p>

无法恢复活动{... mainActivity} : 自定义ViewGroup中的数据指标?

我创建了一个带有其布局的自定义ViewGroup,例如:

<?xml version="1.0" encoding="utf-8"?>
<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">

<androidx.cardview.widget.CardView
    android:id="@+id/card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/margin_8dp"
    android:minHeight="72dp"
    android:orientation="vertical"
    app:cardBackgroundColor="@color/white"
    app:cardCornerRadius="@dimen/margin_8dp"
    app:cardElevation="@dimen/margin_2dp"
    app:strokeColor="@color/color_divider"
    app:strokeWidth=".5dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/clRoot"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="@dimen/margin_16dp">

        <Some Views Here
         ...
         ...
         />

        <LinearLayout
            android:id="@+id/llContainer"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_16dp"
            android:orientation="vertical"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tvHeader"
            tools:background="@color/all_stock_back"
            tools:layout_height="200dp" />

        <Some Views Here
         ...
         ...
         />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>
</layout>

查看代码,例如:

class CustomLayout : LinearLayout {

private lateinit var mBinding: CustomLayoutBinding
private lateinit var containerLayout: LinearLayout

constructor(context: Context) : super(context) {
    initView(context)
}

constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
    initArgs(context, attrs)
    initView(context)
}

constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
    context,
    attrs,
    defStyleAttr
) {
    initArgs(context, attrs)
    initView(context)
}

private fun initView(context: Context) {
    val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    mBinding =
        DataBindingUtil.inflate(inflater, R.layout.custom_layout, this, true)
    containerLayout = mBinding.llContainer
}

private fun initArgs(context: Context, attrs: AttributeSet?) {
    //set attrs
}

override fun onFinishInflate() {
    super.onFinishInflate()
    mBinding.run {
        //Set texts and listeners
    }
}

override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) {
    val id = child?.id
    if (id == # IDsOnLayout
            ) {
        super.addView(child, index, params);
    } else {
        containerLayout.addView(child, index, params);
    }
}
}

当我在任何活动/片段中使用此视图时,并将某些文本或任何内容绑定到其任何一个孩子的视图(如(为简单性,我在此处删除属性)):

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
    <variable name="vm"
        type="SomeViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout>
    
    <CustomLayout 
        android:id="@+id/customid"
        app:collapsable="false">
        
        <GridLayout 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:columnCount="2" android:rowCount="4">

            <androidx.appcompat.widget.AppCompatTextView 
                android:text="@{vm.headerText}" />

            <androidx.appcompat.widget.AppCompatTextView />
            
        </GridLayout>
    </CustomLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

我收到一个错误说:

无法恢复活动{... mainActivity}:java.lang.nullpointerexception:尝试调用虚拟方法'void androidx.appcompat.widget.appcompattextview.settag(java.lang.object) /p>

)在我的CustomLayout内部是空的。我想AddView和Dbimpl生成存在一些问题。

如何在自定义ViewGroup中使用数据指标?

TLDR;
I receive an error says :

Unable to resume activity {...MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.widget.AppCompatTextView.setTag(java.lang.Object)' on a null object reference

How can I use databinding in Custom ViewGroup?

I created a custom ViewGroup with its layout like :

<?xml version="1.0" encoding="utf-8"?>
<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">

<androidx.cardview.widget.CardView
    android:id="@+id/card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/margin_8dp"
    android:minHeight="72dp"
    android:orientation="vertical"
    app:cardBackgroundColor="@color/white"
    app:cardCornerRadius="@dimen/margin_8dp"
    app:cardElevation="@dimen/margin_2dp"
    app:strokeColor="@color/color_divider"
    app:strokeWidth=".5dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/clRoot"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="@dimen/margin_16dp">

        <Some Views Here
         ...
         ...
         />

        <LinearLayout
            android:id="@+id/llContainer"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_16dp"
            android:orientation="vertical"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tvHeader"
            tools:background="@color/all_stock_back"
            tools:layout_height="200dp" />

        <Some Views Here
         ...
         ...
         />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>
</layout>

And View code like:

class CustomLayout : LinearLayout {

private lateinit var mBinding: CustomLayoutBinding
private lateinit var containerLayout: LinearLayout

constructor(context: Context) : super(context) {
    initView(context)
}

constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
    initArgs(context, attrs)
    initView(context)
}

constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
    context,
    attrs,
    defStyleAttr
) {
    initArgs(context, attrs)
    initView(context)
}

private fun initView(context: Context) {
    val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    mBinding =
        DataBindingUtil.inflate(inflater, R.layout.custom_layout, this, true)
    containerLayout = mBinding.llContainer
}

private fun initArgs(context: Context, attrs: AttributeSet?) {
    //set attrs
}

override fun onFinishInflate() {
    super.onFinishInflate()
    mBinding.run {
        //Set texts and listeners
    }
}

override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) {
    val id = child?.id
    if (id == # IDsOnLayout
            ) {
        super.addView(child, index, params);
    } else {
        containerLayout.addView(child, index, params);
    }
}
}

When I use this view in any activity/fragment and bind some text or anything to any of its child views like (for simplicity I removed attributes here):

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
    <variable name="vm"
        type="SomeViewModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout>
    
    <CustomLayout 
        android:id="@+id/customid"
        app:collapsable="false">
        
        <GridLayout 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:columnCount="2" android:rowCount="4">

            <androidx.appcompat.widget.AppCompatTextView 
                android:text="@{vm.headerText}" />

            <androidx.appcompat.widget.AppCompatTextView />
            
        </GridLayout>
    </CustomLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

I receive an error says :

Unable to resume activity {...MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.widget.AppCompatTextView.setTag(java.lang.Object)' on a null object reference

In generated DBImpl textviews inside my customlayout are null. I guess there is some problem with addview and DBImpl generation.

How can I use databinding in Custom ViewGroup?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文