gpt4 book ai didi

android - 自定义 View 上的 findViewById 抛出 null

转载 作者:行者123 更新时间:2023-12-03 08:29:55 29 4
gpt4 key购买 nike

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

我是 Android 初学者。我正在使用自定义 View 类,比如说 CustomView,它看起来像:

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

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

}
var number = 1
}

我在 fragment 资源中膨胀这个 View ,例如:

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

但现在每当我尝试获取自定义 View 时,它都是空的。所有同级 View 都工作正常。

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 父类(super class)构造函数中:

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) {

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

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

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

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

关于android - 自定义 View 上的 findViewById 抛出 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65437496/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com