1. ホーム
  2. android

[解決済み] カスタムレイアウトとEditTextを持つAlertDialog.Builderは、ビューにアクセスすることができません。

2022-05-14 09:53:46

質問

アラートダイアログを作成しようとしています。 EditText オブジェクトでアラートダイアログを作成しようとしています。の初期テキストを設定する必要があります。 EditText の初期テキストをプログラム的に設定する必要があります。以下は、私が持っているものです。

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
AlertDialog alertDialog = dialogBuilder.create();
LayoutInflater inflater = this.getLayoutInflater();
alertDialog.setContentView(inflater.inflate(R.layout.alert_label_editor, null));
EditText editText = (EditText) findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();

を有効にするために、何を変更する必要がありますか? EditText オブジェクトを作成するために、何を変更する必要がありますか?

[編集]

で、user370305さんらから指摘されたのが、このように alertDialog.findViewById(R.id.label_field);

残念ながらここにも問題があります。どうやら、コンテンツビューを AlertDialog にコンテンツビューを設定すると、実行時にプログラムがクラッシュするようです。ビルダーに設定する必要があります。

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));
AlertDialog alertDialog = dialogBuilder.create();
LayoutInflater inflater = this.getLayoutInflater();
EditText editText = (EditText) alertDialog.findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();

残念ながら、これをやると alertDialog.findViewById(R.id.label_field); が返されます。 null .

[/edit]

どのように解決するのですか?

editTextalertDialog レイアウトの一部なので editText を参照しながら alertDialog

EditText editText = (EditText) alertDialog.findViewById(R.id.label_field);

更新しました。

なぜなら、コード行に dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));

inflater Null .

以下のようにコードを更新し、各コード行を理解するようにしてください。

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
// ...Irrelevant code for customizing the buttons and title
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.alert_label_editor, null);
dialogBuilder.setView(dialogView);

EditText editText = (EditText) dialogView.findViewById(R.id.label_field);
editText.setText("test label");
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.show();

アップデート2です。

UIコンポーネントの更新にInflaterで生成されたViewオブジェクトを使用しているため、他の方法では、直接 setView(int layourResId) のメソッドを使うこともできます。 AlertDialog.Builder クラスのメソッドで、API 21 以降で利用可能です。