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]

Don Subert
sumber

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.

pengguna370305
sumber
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();
Naveen Kumar
sumber
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();
Sumit Saxena
sumber
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 .

Nilesh Deokar
sumber
2

Ubah ini:

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

untuk ini:

EditText editText = (EditText)  v.findViewById(R.id.label_field);
The Holy Coder
sumber
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();
Sercan Ozdemir
sumber
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");
}
CodeToLife
sumber