【问题标题】:findViewById on custom view throws null自定义视图上的 findViewById 抛出 null
【发布时间】:2021-04-02 20:33:57
【问题描述】:

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

我是 Android 的初学者。我正在使用自定义视图类,假设 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

【问题讨论】:

  • 你为什么要膨胀视图,为什么不直接在片段中使用CustomeView。
  • 因为片段也有其他组件

标签: android xml kotlin android-custom-view illegalstateexception


【解决方案1】:

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

要允许 Android Studio 与您的视图交互,您至少必须提供一个以 Context 和 AttributeSet 对象作为参数的构造函数。此构造函数允许布局编辑器创建和编辑视图的实例。

(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 类)

【讨论】:

  • 这对我有用。但是还有一件事,我如何获取和更新 number 属性并在片段中显示更新的值?
  • 您确定要创建自定义视图吗?如果是这样,您应该阅读一些关于它的教程,它有点高级。如果不是我的建议是不要打扰,请在您的片段布局中粘贴 TextView 并在您的片段代码中更新它。如果你是初学者,除非迫不得已,否则你真的不想这样做!
  • 基本上我想在一个绘图应用程序上实现它,其中 CustomView 作为画布进行绘制,它将在片段内膨胀。所以,我想从片段中修改笔的大小和颜色。之前,我可以做到这一点,我认为通过一个基本示例来理解事物是如何工作的会更好,所以我选择了这个。我计划在自定义视图中有一个公共笔大小属性,我可以从片段更新它并开始使用新的笔大小进行绘制。
  • 好的,您确实需要阅读此内容,但是您可以在自定义视图中扩展布局(例如使用 Fragment),或者您可以绘制到 Canvas,这就是你想做。您基本上实现了onDraw 并使用Paint 使用绘图命令(如drawText 或drawLine)。所以如果你想写一个数字,你可以使用drawText。但老实说,我觉得您正在做的是自定义视图(触摸和一切)的更高级用途之一,因此寻找绘画应用教程可能是您最好的选择,它可以向您展示它的基本工作原理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
相关资源
最近更新 更多