2013年6月20日 星期四

[Android] 如何正確取得 AlertDialog 元件的 findViewById

一般正規的 Android layout 中,如需控制元件,首先需執行 findViewById 取得元件的控制入口,例如

  Spinner spinner = (Spinner)view.findViewById(R.id.spinner_player);
  EditText edittextPlayer = (EditText)view.findViewById(R.id.editText_player);

若元件所屬的 layout 被設定到 AlertDialog 之中呢?如果還是使用上述的呼叫方式,雖然 Eclipse 不會報錯,但執行時一旦操作元件,將會遇到 "null pointer" 的 exception。
需改寫成以下方式,第 2、3 行的元件必須使用第 1 行定義的 view 來呼叫 findViewById。
  View view = View.inflate(this, R.layout.activity_player, null);
  Spinner spinner = (Spinner)view.findViewById(R.id.spinner_player);
  EditText edittextPlayer = (EditText)view.findViewById(R.id.editText_player);
  
  AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
  alertDialog.setTitle("Player Setting");
  alertDialog.setMessage("Set the number of players");
  alertDialog.setCancelable(false); // 避免點選畫面其他地方而關閉 AlertDialog
  alertDialog.setView(view);
  alertDialog.setPositiveButton("OK", null);
  alertDialog.setNegativeButton("Cancel", null);
  alertDialog.show();

0 意見:

張貼留言