自定义视图 returns 初始化时为 NULL
Custom view returns NULL when initialized
我想创建一个自定义的可重用视图以在 gridlayout
中显示。
我似乎无法初始化视图。在我的 Activity
中总是 returns null
任何人都可以帮助我理解我做错了什么吗?我觉得它在我的 Tile 构造函数中。
我的Activity:
private void addTile() {
TileView tile = new TileView(this);
tile.setTextTitle("CALLS");
tile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tilePressed(v);
}
});
mGridLayout.addView(tile);
}
Activity 的 XML 的 GridLayout 部分:
<GridLayout
android:id="@+id/glTileArea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/COLOR_LIGHT_GREEN"
android:columnCount="2"
android:rowCount="2" >
</GridLayout>
我的可重用视图:
public class TileView extends View{
private View mView;
private Context mContext;
private TextView mTitle;
public TileView(Context context) {
super(context);
this.mContext = context;
}
public View TileView(){
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
mView = inflater.inflate(R.layout.sample_tile_view,null);
mTitle = (TextView) mView.findViewById(R.id.tvTitle);
return mView;
}
public void setTextTitle(String text){
mTitle.setText(text);
}
}
XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/COLOR_BLUE"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="TITLE"
android:textAlignment="center"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/COLOR_WHITE"
android:textStyle="bold"/>
</LinearLayout>
我得到的错误:
Attempt to invoke virtual method 'void
android.widget.TextView.setText(java.lang.CharSequence)' on a null
object reference at com.mycompany.myapp.Views.TileView.setTextTitle
(TileView.java:77)
问题是由于:
tile.setTextTitle("CALLS");
行。 mTitle
是 null
因为在初始化 TextView 的任何地方都没有调用 TileView()
方法。
要么在调用setTextTitle
方法之前调用TileView()
:
tile.TileView();
tile.setTextTitle("CALLS");
或者在构造函数中调用TileView
方法:
public TileView(Context context) {
super(context);
this.mContext = context;
this.TileView(); //<< call here
}
尝试将TileView()中的代码移动到TileView(Context context)
public TileView(Context context) {
super(context);
this.mContext = context;
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
mView = inflater.inflate(R.layout.sample_tile_view,null);
mTitle = (TextView) mView.findViewById(R.id.tvTitle);
}
我想创建一个自定义的可重用视图以在 gridlayout
中显示。
我似乎无法初始化视图。在我的 Activity
中总是 returns null任何人都可以帮助我理解我做错了什么吗?我觉得它在我的 Tile 构造函数中。
我的Activity:
private void addTile() {
TileView tile = new TileView(this);
tile.setTextTitle("CALLS");
tile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tilePressed(v);
}
});
mGridLayout.addView(tile);
}
Activity 的 XML 的 GridLayout 部分:
<GridLayout
android:id="@+id/glTileArea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/COLOR_LIGHT_GREEN"
android:columnCount="2"
android:rowCount="2" >
</GridLayout>
我的可重用视图:
public class TileView extends View{
private View mView;
private Context mContext;
private TextView mTitle;
public TileView(Context context) {
super(context);
this.mContext = context;
}
public View TileView(){
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
mView = inflater.inflate(R.layout.sample_tile_view,null);
mTitle = (TextView) mView.findViewById(R.id.tvTitle);
return mView;
}
public void setTextTitle(String text){
mTitle.setText(text);
}
}
XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/COLOR_BLUE"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="TITLE"
android:textAlignment="center"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/COLOR_WHITE"
android:textStyle="bold"/>
</LinearLayout>
我得到的错误:
Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.mycompany.myapp.Views.TileView.setTextTitle (TileView.java:77)
问题是由于:
tile.setTextTitle("CALLS");
行。 mTitle
是 null
因为在初始化 TextView 的任何地方都没有调用 TileView()
方法。
要么在调用setTextTitle
方法之前调用TileView()
:
tile.TileView();
tile.setTextTitle("CALLS");
或者在构造函数中调用TileView
方法:
public TileView(Context context) {
super(context);
this.mContext = context;
this.TileView(); //<< call here
}
尝试将TileView()中的代码移动到TileView(Context context)
public TileView(Context context) {
super(context);
this.mContext = context;
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
mView = inflater.inflate(R.layout.sample_tile_view,null);
mTitle = (TextView) mView.findViewById(R.id.tvTitle);
}