更改 customView 的层次结构时数据绑定中的 NPE 崩溃

问题描述

<span class="col-md-2" id="hospital-icon-jquery"> <i class="fas fa-hospital cc_cursor" ></i> 

我在下面的表单中使用我的自定义视图。

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout

class MyCustomView @JvmOverloads constructor(context: Context,attributeSet: AttributeSet? = null)  : FrameLayout(
    context,attributeSet
) {
    val binding = MylayoutBinding.inflate(
        LayoutInflater.from(context),this,true
    )
}

// mylayout.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <merge>
        <FrameLayout
            android:id="@+id/myChildContainer"
            android:layout_width="100dp"
            android:layout_height="100dp"/>
    </merge>
</layout>

在上面的示例中,我希望 myButton 作为 myChildContainer 的子项进入 MyCustomView。

我遵循了 android: how to add children from an xml layout into a custom view 中的示例并修改了 MyCustomView,如下所示。

// myactivity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
        <MyCustomView
            android:id="@+id/myView"
            android:layout_width="300dp"
            android:layout_height="300dp">
            <Button
                android:id="@+id/myButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </MyCustomView>
    </FrameLayout>
</layout>

如果我不应用数据绑定,这段代码就可以了。

问题是当我应用数据绑定时应用程序崩溃了。

class MyCustomView @JvmOverloads constructor(context: Context,true
    )

    override fun onFinishInflate() {
        super.onFinishInflate()
        while (childCount > 1) {
            val child = getChildAt(1)
            val param = child.layoutParams
            removeView(child)
            binding.myChildContainer.addView(child,param)
        }
    }
}
internal class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<MyactivityBinding>(this,R.layout.myactivity)
        binding.myButton.text = "Test Text" <-- crash
    }
}

当我把代码的remove view和addview的执行点从onFinishInflate改成onAttachedToWindow时,一般不会出现这个错误,但是我已经确认是间歇性的重复出现,所以我认为这不是一个解决方案。

有没有办法在保持数据绑定的同时将子视图添加自定义视图?

我实际上使用了多个这样的视图,所以我不想在 setContentView 之后调用像 myView.sortView() 这样的单个函数

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)