AlertDialog.Builder dengan tata letak khusus dan EditText; tidak dapat mengakses tampilan


101

Saya mencoba membuat dialog peringatan dengan sebuah EditTextobjek. Saya perlu mengatur teks awal secara EditTextterprogram. Inilah yang saya miliki.

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();

Apa yang harus saya ubah agar saya dapat memiliki valid EditText objek yang ?

[edit]

Jadi, itu ditunjukkan oleh user370305 dan lainnya yang harus saya gunakan alertDialog.findViewById(R.id.label_field);

Sayangnya, ada masalah lain di sini. Rupanya, pengaturan tampilan konten AlertDialogmenyebabkan program macet saat runtime. Anda harus mengaturnya di pembangun.

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();

Sayangnya, saat Anda melakukan ini, alertDialog.findViewById(R.id.label_field);sekarang kembali null.

[/ edit]

Jawaban:


238

editTextadalah bagian dari alertDialogtata letak, jadi akses saja editTextdengan referensialertDialog

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

Memperbarui:

Karena dalam baris kode dialogBuilder.setView(inflater.inflate(R.layout.alert_label_editor, null));

inflateradalah Null .

perbarui kode Anda seperti di bawah ini, dan coba pahami setiap baris kode

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();

Perbarui 2:

Saat Anda menggunakan objek View yang dibuat oleh Inflater untuk memperbarui komponen UI, Anda bisa langsung menggunakan setView(int layourResId)metode AlertDialog.Builderkelas, yang tersedia dari API 21 dan seterusnya.


22
Anda juga dapat melakukannya sebagai:dialogBuilder.setView(R.layout.dialog_layout);
SiavA

4
@SiavA metode ini hanya tersedia dari API 21.
Scaraux

Saya telah mencoba menampilkan Dialog dan tidak berfungsi di RecyclerView tetapi yang ini berhasil.
Muneeb Mirza

Anda dapat menggunakan getLayoutInflater()jika inflatertidak ditentukan.
garis miring terbalikN

1
@saigopi saat Anda mengganti onClick, akan ada argumen (dialog DialogInterface, int id). Dalam metode onClick ini, cukup teruskan dialog.cancel ();
Minkoo

29

Gunakan yang ini

   AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    // Get the layout inflater
    LayoutInflater inflater = (activity).getLayoutInflater();
    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the
    // dialog layout
    builder.setTitle(title);
    builder.setCancelable(false);
    builder.setIcon(R.drawable.galleryalart);
    builder.setView(inflater.inflate(R.layout.dialogue, null))
    // Add action buttons
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {

                    }
                }
            });
    builder.create();
    builder.show();

seharusnya builder.create().show();, Anda dapat memeriksa builder.show();kode untuk detail lebih lanjut
Phan Van Linh

9

Kamu bisa menulis:

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);

Button button = (Button)dialogView.findViewById(R.id.btnName);

   button.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {

         //Commond here......

       }
   });

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

editText.setText("test label"); 

dialogBuilder.create().show();

3

Jika ada yang menginginkannya di Kotlin:

val dialogBuilder = AlertDialog.Builder(this)
// ...Irrelevant code for customizing the buttons and title
val dialogView = layoutInflater.inflate(R.layout.alert_label_editor, null)
dialogBuilder.setView(dialogView)

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

Mem- posting ulang jawaban @ user370305 .


2

Ubah ini:

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

untuk ini:

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

1
View v=inflater.inflate(R.layout.alert_label_editor, null);
alertDialog.setContentView(v);
EditText editText = (EditText)v.findViewById(R.id.label_field);
editText.setText("test label");
alertDialog.show();

1
/**
 * Shows  confirmation dialog about signing in.
 */
private void startAuthDialog() {
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    AlertDialog alertDialog = dialogBuilder.create();
    alertDialog.show();

    alertDialog.getWindow().setLayout(800, 1400);
    LayoutInflater inflater = this.getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.auth_dialog, null);
    alertDialog.getWindow().setContentView(dialogView);
    EditText editText = (EditText) dialogView.findViewById(R.id.label_field);
    editText.setText("test label");
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.