所有自定义视图实例变量均为空
All custom view instance variables are null
我创建了一个扩展 LinearLayout 并包含两个 TextView 的自定义视图。尽管我在 onFinishInflate() 中设置了文本视图,但稍后在这些文本视图上调用 setText() 时,我得到了空指针异常。
这是自定义视图的代码:
public class MyCustomView extends LinearLayout{
private TextView textView1;
private TextView textView2;
public MyCustomView(Context context){
super(context);
LayoutInflater layoutInflater = LayoutInflater.from(context);
layoutInflater.inflater(R.layout.my_custom_view, this);
}
public MyCustomView(Context context, AttributeSet attrs){
super(context, attrs);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
@Override
protected void onFinishInflate(){
super.onFinishInflate();
textView1 = (TextView)findViewById(R.id.tv1);
textView2 = (TextView)findViewById(R.id.tv2);
}
// here's where I get the null pointer for textView1
public void setTitle(String title){
textView1.setText(title);
}
}
my_custom_view.xml 看起来像这样:
<?xml version="1.0" encoding="utf-8">
<my_package.myapp.MyCustomView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</my_package.myapp.MyCustomView>
我以后会像这样使用自定义视图:
View view = new MyCustomView(context);
((MyCustomView)view).setTitle("Title"); // null pointer exception here
return view;
有什么我误解或做错的想法吗?我真的很感激任何帮助。
我还注意到,如果我修改第一个构造函数以获取其他对象,然后尝试使用该对象,则该实例变量也为空。例如:
public MyCustomView(Context context, SomeObject object){
this.object = object;
}
// as with the textviews, object would be null here
public int getObjectValue(){
return object.getValue();
}
谢谢!
好的,这里有多个问题。
1)你的xml是错误的。它应该从合并开始,而不是对你的 class 的引用,如果你将它膨胀到你的 class.
2) 所有 3 个构造函数都需要做 inflation 的事情。 (这就是失败原因的一部分——这里会调用 2 或 3 参数的构造函数)。
3)您不想也不需要覆盖 onFinishInflate。将该代码放入构造函数中。 Inflation 不是异步的,所以没有理由不这样做。
我创建了一个扩展 LinearLayout 并包含两个 TextView 的自定义视图。尽管我在 onFinishInflate() 中设置了文本视图,但稍后在这些文本视图上调用 setText() 时,我得到了空指针异常。
这是自定义视图的代码:
public class MyCustomView extends LinearLayout{
private TextView textView1;
private TextView textView2;
public MyCustomView(Context context){
super(context);
LayoutInflater layoutInflater = LayoutInflater.from(context);
layoutInflater.inflater(R.layout.my_custom_view, this);
}
public MyCustomView(Context context, AttributeSet attrs){
super(context, attrs);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
@Override
protected void onFinishInflate(){
super.onFinishInflate();
textView1 = (TextView)findViewById(R.id.tv1);
textView2 = (TextView)findViewById(R.id.tv2);
}
// here's where I get the null pointer for textView1
public void setTitle(String title){
textView1.setText(title);
}
}
my_custom_view.xml 看起来像这样:
<?xml version="1.0" encoding="utf-8">
<my_package.myapp.MyCustomView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</my_package.myapp.MyCustomView>
我以后会像这样使用自定义视图:
View view = new MyCustomView(context);
((MyCustomView)view).setTitle("Title"); // null pointer exception here
return view;
有什么我误解或做错的想法吗?我真的很感激任何帮助。
我还注意到,如果我修改第一个构造函数以获取其他对象,然后尝试使用该对象,则该实例变量也为空。例如:
public MyCustomView(Context context, SomeObject object){
this.object = object;
}
// as with the textviews, object would be null here
public int getObjectValue(){
return object.getValue();
}
谢谢!
好的,这里有多个问题。
1)你的xml是错误的。它应该从合并开始,而不是对你的 class 的引用,如果你将它膨胀到你的 class.
2) 所有 3 个构造函数都需要做 inflation 的事情。 (这就是失败原因的一部分——这里会调用 2 或 3 参数的构造函数)。
3)您不想也不需要覆盖 onFinishInflate。将该代码放入构造函数中。 Inflation 不是异步的,所以没有理由不这样做。