在解释问题之前,我想说我已经看过所有相关问题,但是没有一个对我有用。
我是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"/>
但是现在,每当我尝试获取自定义视图时,它都为null。所有同级视图都可以正常工作。
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
超类构造函数:
要允许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
在片段的布局中粘贴a并在片段代码中对其进行更新。如果您是初学者,那么除非您必须这样做,否则您确实不希望这样做!基本上,我想在Paint应用程序上实现它,其中CustomView用作要绘制的画布,它将在片段中被放大。因此,我想从片段中修改笔的大小和颜色。以前,我可以这样做,我认为最好通过一个基本示例来了解事物的工作方式,因此我选择了它。我计划在自定义视图中具有一个公共的笔号属性,可以从片段中更新该属性并开始使用新的笔号进行绘制。
好的,您确实需要对此进行阅读,但是您可以在自定义视图中填充一个布局(例如使用Fragment),也可以绘制到
Canvas
,这就是您想要做的。基本上onDraw
,您可以使用来实现和使用绘图命令(例如drawText
或drawLine
)Paint
。因此,如果您想写一个数字,可以使用drawText
。但老实说,我觉得您正在做的是自定义视图(触摸和所有内容)的更高级用法之一,因此,找到一个绘画应用程序教程可能是您的最佳选择,它向您展示了这一切的基本原理