自定义视图上的 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)
在解释我的问题之前,我想说我已经看过所有相关问题,但是 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 anAttributeSet
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)