这是我的自定义Button类的一部分,Tile:
public class Tile extends Button {
// Position of this view in AL tiles.
private int index;
// Height of tile in pixels.
private int layout_height;
// Width of tile in pixels.
private int layout_width;
public Tile (Context context){
super(context);
}
public Tile (Context context, AttributeSet attrs) {
super(context, attrs);
setUpAttributes(attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
layout_height = heightMeasureSpec;
layout_width = widthMeasureSpec;
}
private void setUpAttributes(AttributeSet attrs){
TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.Tile, 0, 0);
try {
index = a.getIndex(R.styleable.Tile_index);
columnPosition = a.getInt(R.styleable.Tile_columnPosition, 0);
rowPosition = a.getInt(R.styleable.Tile_rowPosition, 0);
} finally {
a.recycle();
}
}
我可以直接将此类的任意数量的实例扩展到GridView。当我尝试在其他类中使用此类时,问题就出现了,特别是当我尝试更改变量的值时。例如,在我的自定义GridView类中,我想填充一个包含Tile类型对象的ArrayList。这就是我这样做的方式:
public void populateTileCollection() {
int index = 0;
for (int y = 0; y < getRowCount(); y++) {
for (int x = 0; x < getColumnCount(); x++) {
Tile tile = (Tile)findViewById(R.id.tile);
tile.setIndex(index);
tile.setYCoordinate(y);
tile.setXCoordinate(x);
tiles.add(tile);
index++;
}
}
}
请注意,我在Tile类中使用准确的变量正确定义了这些setter方法。当我运行该程序时,我收到以下错误:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.app.speedsweeper.speedsweeper.Tile.setIndex(int)' on a null object reference
如果我跳过程序化工作并直接进入这些瓷砖的膨胀,它就可以了。事实上,在给它们充气时,我可以设置它们的属性。但是,当我在充气后尝试访问它们时,会发生同样的错误。
我该如何处理?