Cara menggunakan dan gaya AlertDialog baru dari appCompat 22.1 dan di atas

154

Saya mencoba untuk bermigrasi dari android default AlertDialogke yang baru yang termasuk dalam appCompat-22.1 Sejauh ini saya mengerti Anda hanya perlu mengimpor android.support.v7.app.AlertDialogpaket untuk menggunakannya.

Tapi bagaimana saya bisa mengaturnya? Misalnya mengubah warna tombol positif / negatif, warna judul, warna pesan dan warna latar belakang?

ThanosFisherman
sumber

Jawaban:

448

Saat membuat AlertDialogAnda dapat mengatur tema untuk digunakan.

Contoh - Membuat Dialog

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
builder.setTitle("AppCompatDialog");
builder.setMessage("Lorem ipsum dolor...");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

styles.xml - Gaya khusus

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="android:background">#4CAF50</item>
</style>

Hasil

alertdialog bergaya

Edit

Untuk mengubah Tampilan Judul, Anda dapat melakukan hal berikut. Pertama tambahkan gaya baru:

<style name="MyTitleTextStyle">
    <item name="android:textColor">#FFEB3B</item>
    <item name="android:textAppearance">@style/TextAppearance.AppCompat.Title</item>
</style>

setelah itu cukup rujuk gaya ini di MyAlertDialogStyle:

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    ...
    <item name="android:windowTitleStyle">@style/MyTitleTextStyle</item>
</style>

Dengan cara ini Anda dapat menentukan perbedaan textColoruntuk pesan melalui android:textColorPrimarydan perbedaan untuk judul melalui gaya.

balik
sumber
2
Terima kasih @revers. Satu hal lagi. Banyak perpustakaan memungkinkan untuk memiliki warna Judul dan Teks yang berbeda. Apakah Anda tahu apakah ini mungkin di sini juga?
ThanosFisherman
3
Hai lagi! Apakah ada cara untuk mengubah ukuran teks pesan?
ThanosFisherman
1
@HanosF Sayangnya saya tidak mengetahui adanya atribut xml yang melakukan ini. Tapi itu pasti mungkin melalui Java-Code.
Kembalikan
2
@minummers Jup. Itu pada dasarnya ide appcompat-v7- ini membawa kompatibilitas komponen yang lebih baru ke API Level 7 (Android 2.1)
reVerse
1
Agar warna teks tombol berfungsi pada 21+, saya harus memiliki item android: buttonStyle untuk "MyAlertDialogStyle", dan item android: textColor dalam gaya tombol kustom.
Tim Autin
61

Untuk menggunakan tema untuk semua aplikasi, dan jangan gunakan parameter kedua untuk menata Dialog Anda

<style name="MyTheme" parent="Base.Theme.AppCompat.Light">
    <item name="alertDialogTheme">@style/dialog</item>
    <item name="colorAccent">@color/accent</item>
</style>

<style name="dialog" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/accent</item>
</style>

Pada aplikasi saya menggunakan aksen warna dalam tema, jangan tampilkan tombol alertDialog dengan colorAccent tema saya harus menambahkan gaya dialog dalam tema.

neoteknik
sumber
Tidak berfungsi di API 10 (android 2.3), mungkin hanya di API 11+.
Oliv
2
Mungkin di API 15+. Saya memulai proyek baru hanya di API 15+, saya pikir Android sebelum 4 sudah usang pada tahun 2015.
neoteknic
@Oliv Ini berfungsi pada API 10 menggunakan dependensi com.android.support:design:23.2.1
pejalan kaki
IDEA mengatakan bahwa API 21+ diperlukan untuk menggunakan colorAccent on Base.Theme.AppCompat.Light.Dialog.Lert menggunakan 'com.android.support:design:22.2.1'
Felipe Andrade
@Felipe Andrade Alway menargetkan versi SDK terbaru, itu seharusnya bekerja! Saya punya projet dengan min api 15 dan target 25 desain: 22.x sudah usang, gunakan 25.1.x dan banyak lagi
neoteknic
19

Jika Anda ingin menggunakan android.support.v7.app.AlertDialog baru dan memiliki warna yang berbeda untuk tombol-tombol dan juga memiliki tata letak khusus kemudian lihat di https://gist.github.com/JoachimR/6bfbc175d5c8116d411e

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.custom_layout, null);

    initDialogUi(v);

    final AlertDialog d = new AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle)
            .setTitle(getString(R.string.some_dialog_title))
            .setCancelable(true)
            .setPositiveButton(activity.getString(R.string.some_dialog_title_btn_positive),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            doSomething();
                            dismiss();
                        }
                    })
            .setNegativeButton(activity.getString(R.string.some_dialog_title_btn_negative),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dismiss();
                        }
                    })
            .setView(v)
            .create();

    // change color of positive button         
    d.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            Button b = d.getButton(DialogInterface.BUTTON_POSITIVE);
            b.setTextColor(getResources().getColor(R.color.colorPrimary));
        }
    });

    return d;
}

masukkan deskripsi gambar di sini

IHeartAndroid
sumber
Itu hebat! Terima kasih
ThanosFisherman
Terima kasih, ini satu-satunya cara kerjanya untuk saya, tetapi bisakah Anda memberi tahu saya bagaimana saya bisa mendapatkan warna untuk kotak centang juga? Di aplikasi saya, ada dialog dengan daftar tombol radio yang dibuat via Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener). Saya tidak ingin melakukan subklas adaptor dan mengubah tampilan di sana.
Gabor
artileri berat adalah yang selalu berhasil! Saya harus menggunakan ini untuk mengurus 2 tombol pemberontak yang selalu menolak untuk berubah ke warna aksen!
rupps
7

Ikuti jawaban @reVerse tetapi dalam kasus saya, saya sudah memiliki beberapa properti di AppThemeseperti saya

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="android:textColor">#111</item>
    <item name="android:textSize">13sp</item>
</style>

Jadi dialog saya akan terlihat seperti
masukkan deskripsi gambar di sini

Saya menyelesaikannya dengan

1) Ubah impor dari android.app.AlertDialogmenjadi android.support.v7.app.AlertDialog
2) Saya mengganti 2 properti AppThemedengan nilai nol

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="android:background">#4CAF50</item>


    <item name="android:textColor">@null</item>
    <item name="android:textSize">@null</item>
</style>

.

AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.MyAlertDialogStyle);

Semoga ini bisa membantu orang lain

masukkan deskripsi gambar di sini

Phan Van Linh
sumber
Terima kasih! Saya tidak menggunakan dukungan AlertDialog.
masterwok
1

Jika Anda seperti saya, Anda hanya ingin memodifikasi beberapa warna di AppCompat, dan satu-satunya warna yang perlu Anda ubah secara unik dalam dialog adalah latar belakang. Maka yang perlu Anda lakukan hanyalah mengatur warna colorBackgroundFloating.

Inilah tema dasar saya yang hanya memodifikasi beberapa warna tanpa tema bersarang:

    <style name="AppTheme" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/theme_colorPrimary</item>
        <item name="colorPrimaryDark">@color/theme_colorPrimaryDark</item>
        <item name="colorAccent">@color/theme_colorAccent</item>
        <item name="colorControlActivated">@color/theme_colorControlActivated</item>
        <item name="android:windowBackground">@color/theme_bg</item>
        <item name="colorBackgroundFloating">@color/theme_dialog_bg</item><!-- Dialog background color -->
        <item name="colorButtonNormal">@color/theme_colorPrimary</item>
        <item name="colorControlHighlight">@color/theme_colorAccent</item>
    </style>
Tenfour04
sumber
-3
    <item name="editTextColor">@color/white</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">@color/gray</item>
    <item name="android:textColorPrimary">@color/gray</item>
    <item name="colorControlNormal">@color/gray</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">#30FFFFFF</item>
Muhammed Akif
sumber