自定义视图上的 findViewById 抛出 null

findViewById on custom view throws null

在解释我的问题之前,我想说我已经看过所有相关问题,但是 none 对我有用。

我是 Android 的初学者。我正在使用自定义视图 class,假设 CustomView 看起来像:

class CustomView(context: Context?,attributeSet: AttributeSet) : View(context) {

    class CustomView constructor(context: Context?, attributeSet: AttributeSet){

    }
    var number = 1
}

我正在片段资源中扩充此视图,例如:

<com.example.myapp.CustomView
     android:id="@+id/custom_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"/>

但现在每当我尝试获取自定义视图时,它都是空的。所有兄弟视图都工作正常。

val root = inflater.inflate(R.layout.fragment_main, container,false)
val customView: CustomView = root.findViewById(R.id.custom_view)

正在抛出错误

java.lang.IllegalStateException: findViewById(R.id.custom_view) must not be null

您需要将 AttributeSet 参数传递给 View superclass 构造函数:

To allow Android Studio to interact with your view, at a minimum you must provide a constructor that takes a Context and an AttributeSet object as parameters. This constructor allows the layout editor to create and edit an instance of your view.

(https://developer.android.com/training/custom-views/create-view#subclassview)

所以:

class CustomView(context: Context?,attributeSet: AttributeSet) : View(context, attributeSet) {

如果你愿意,这是标准样板,重载自定义视图构造函数(IDE 将为你生成):

class CustomView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr)

这有一些边缘案例主题妥协,但通常没问题,并且可以处理系统想要使用的任何构造函数。

(此外,您的代码中不需要嵌套 CustomView class)