在 onCreate() **之前** 就嘗試 findViewById(R.id.gridview1):
// 錯誤位置:類成員變數初始化階段執行,此時 Layout 尚未 inflate,root view 為 null
GridView gridview = (GridView) findViewById(R.id.gridview1);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // Layout 這纔被載入
// ...
}
findViewById 依賴 setContentView() 後的視圖樹,在此之前調用必回傳 null,後續 gridview.setAdapter() 拋出 NPE。
public class MainActivity extends Activity {
private int[] imageId = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.e, R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.i};
private ImageSwitcher imageSwitcher;
private GridView gridView; // 宣告為成員變數
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 1. 先載入 Layout
// 2. 再 findViewById
gridView = findViewById(R.id.gridview1);
imageSwitcher = findViewById(R.id.imageSwitcher1);
// 3. 配置 ImageSwitcher 動畫與 Factory
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
imageSwitcher.setFactory(() -> {
ImageView iv = new ImageView(MainActivity.this);
iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
iv.setLayoutParams(new ImageSwitcher.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
return iv;
});
imageSwitcher.setImageResource(imageId[6]); // 預設顯示第7張
// 4. 設定 GridView Adapter
gridView.setAdapter(new BaseAdapter() {
@Override public int getCount() { return imageId.length; }
@Override public Object getItem(int position) { return imageId[position]; }
@Override public long getItemId(int position) { return position; }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv;
if (convertView == null) {
iv = new ImageView(MainActivity.this);
iv.setAdjustViewBounds(true);
iv.setMaxWidth(150);
iv.setMaxHeight(113);
iv.setPadding(5, 5, 5, 5);
} else {
iv = (ImageView) convertView;
}
iv.setImageResource(imageId[position]);
return iv;
}
});
// 5. 設定點擊切換大圖
gridView.setOnItemClickListener((parent, view, position, id) ->
imageSwitcher.setImageResource(imageId[position]));
}
}