所以我有这个自定义布局。
public class MyCustomView extends ConstraintLayout {
private Button myFancyButton;
public MyCustomView (@NonNull Context context, AttributeSet attrs) {
super(context,attrs);
myFancyButton = findViewById(R.id.button); //THIS IS NULL
}
public void init(){
myFancyButton = findViewById(R.id.button); //WORKS GREAT
}
}
问题是我宁愿不创建函数“ init”来完成适合于构造函数的工作。我面临的问题是在构造函数中调用findViewById导致其为null。在MyCustomView对象上使用init函数可以很好地工作。但我宁愿在构造函数中执行此操作。
相应的XML文件如下所示。
<?xml version="1.0" encoding="utf-8"?>
<se.test.test.test.MyCustomView xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="B1"
android:textSize="30sp"/>
</se.test.test.test.MyCustomView>
您需要将该代码放入onFinishInflate()
-布局及其子级膨胀时将调用该方法。
@Override
public void onFinishInflate() {
myFancyButton = findViewById(R.id.button)
}
https://developer.android.com/reference/android/view/View#onFinishInflate()