Dalam dokumen Android di AlertDialog , ini memberikan instruksi dan contoh berikut untuk menyetel tampilan kustom di AlertDialog:
Jika Anda ingin menampilkan tampilan yang lebih kompleks, cari FrameLayout yang disebut "body" dan tambahkan tampilan Anda ke sana:
FrameLayout fl = (FrameLayout) findViewById(R.id.body);
fl.add(myView, new LayoutParams(FILL_PARENT, WRAP_CONTENT));
Pertama, cukup jelas bahwa add()
itu salah ketik dan memang seharusnya begitu addView()
.
Saya bingung dengan baris pertama yang menggunakan R.id.body. Tampaknya itu adalah elemen tubuh dari AlertDialog ... tetapi saya tidak bisa memasukkannya begitu saja dalam kode saya b / c itu memberikan kesalahan kompilasi. Di mana R.id.body ditetapkan atau ditugaskan atau apa pun?
Ini kode saya. Saya mencoba menggunakan setView(findViewById(R.layout.whatever)
pada pembangun tetapi tidak berhasil. Saya berasumsi karena saya tidak mengembang secara manual?
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title")
.setCancelable(false)
.setPositiveButton("Go", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
EditText textBox = (EditText) findViewById(R.id.textbox);
doStuff();
}
});
FrameLayout f1 = (FrameLayout)findViewById(R.id.body /*CURRENTLY an ERROR*/);
f1.addView(findViewById(R.layout.dialog_view));
AlertDialog alert = builder.create();
alert.show();
android
android-alertdialog
Stormin986
sumber
sumber
.setView(getLayoutInflater().inflate(R.layout.dialog_view, null))
ke pembangun. Penghargaan untuk Sergio Viudes, di bawah.Jawaban:
Anda benar, itu karena Anda tidak mengembang secara manual. Tampaknya Anda mencoba "mengekstrak" id "body" dari tata letak Aktivitas Anda, dan itu tidak akan berhasil.
Anda mungkin menginginkan sesuatu seperti ini:
sumber
builder.setView(inflater.inflate(R.id.dialog, ROOT_VIEWGROUP[, ATTACH_TO_ROOT]))
, dokumen mengatakan grup tampilan root adalah opsional. Haruskah ini digunakan dalam kasus ini? Jika demikian ... masih harus mencari cara untuk mendapatkan referensi ke AlertDialog ...View
Anda mengembang. PanggilfindViewById()
ituView
ketika Anda membutuhkan barang dari isinya. Lihat: github.com/commonsguy/cw-android/tree/master/Database/ConstantsAnda dapat membuat tampilan langsung dari Layout Inflater, Anda hanya perlu menggunakan nama file XML layout dan ID layout dalam file.
File XML Anda harus memiliki ID seperti ini:
Dan kemudian Anda dapat menyetel tata letak Anda pada pembuat dengan kode berikut:
sumber
getCurrentFocus()
akan mengembalikan EditText dan EditText tidak dapat dilemparkan ke ViewGroup. Menggunakannull
sebagai argumen kedua memperbaiki ini.android.R.id.custom mengembalikan null untuk saya. Saya berhasil membuat ini berfungsi jika ada yang menemukan masalah yang sama,
Sebagai referensi, R.layout.simple_password adalah:
sumber
FrameLayout
bertindak sebagai semacam fragmen? Ketika saya mencoba jawaban Andrewx2 di atas, saya mendapat kesalahan karena mengira saya menggembungkan dua tata letak (tebakan saya).Dokumen android telah diedit untuk memperbaiki kesalahan.
Tampilan di dalam AlertDialog dipanggil
android.R.id.custom
http://developer.android.com/reference/android/app/AlertDialog.html
sumber
Ini berhasil untuk saya:
sumber
AlertDialog Kustom
Contoh lengkap ini termasuk meneruskan data kembali ke Aktivitas.
Buat tata letak khusus
Tata letak dengan an
EditText
digunakan untuk contoh sederhana ini, tetapi Anda dapat menggantinya dengan apa pun yang Anda suka.custom_layout.xml
Gunakan dialog dalam kode
Bagian kuncinya adalah
setView
untuk menetapkan tata letak khusus keAlertDialog.Builder
Ini adalah kode lengkap dari proyek contoh yang ditunjukkan pada gambar di atas:
MainActivity.java
Catatan
DialogFragment
subclass seperti yang dijelaskan dalam dokumentasi .Lihat juga
sumber
EditText editText = customLayout.findViewById(R.id.editText);
harusEditText editText = (EditText) customLayout.findViewById(R.id.editText);
Baris kode paling sederhana yang berfungsi untuk saya adalah sebagai berikut:
Apa pun jenis tata letaknya (LinearLayout, FrameLayout, RelativeLayout) akan berfungsi
setView
dan hanya akan berbeda dalam tampilan dan perilakunya.sumber
Cara termudah untuk melakukannya adalah dengan menggunakan
android.support.v7.app.AlertDialog
bukannyaandroid.app.AlertDialog
manapublic AlertDialog.Builder setView (int layoutResId)
dapat digunakan di bawah API 21.sumber
AlertDialog.setView(View view)
menambahkan tampilan yang diberikan keR.id.custom FrameLayout
. Berikut ini adalah cuplikan kode sumber AndroidAlertController.setupView()
yang akhirnya menangani ini (mView
adalah tampilan yang diberikan keAlertDialog.setView
metode).sumber
Setelah mengubah ID menjadi android.R.id.custom, saya perlu menambahkan yang berikut ini untuk menampilkan View:
Namun, hal ini menyebabkan Tampilan baru dirender dalam tampilan induk besar tanpa latar belakang, memutus kotak dialog menjadi dua bagian (teks dan tombol, dengan Tampilan baru di antaranya). Saya akhirnya mendapatkan efek yang saya inginkan dengan menyisipkan View saya di sebelah pesan:
Saya menemukan solusi ini dengan menjelajahi pohon View dengan View.getParent () dan View.getChildAt (int). Tapi tidak terlalu senang. Semua ini tidak ada di dokumen Android dan jika mereka pernah mengubah struktur AlertDialog, ini mungkin rusak.
sumber
Akan sangat masuk akal untuk melakukannya dengan cara ini, jumlah kode yang paling sedikit.
Untuk daftar tambahan hal-hal yang bisa Anda setel, mulailah mengetik
.set
di Android Studiosumber