Bagaimana saya bisa mengubah warna teks tombol dialog default di Android 5

160

Saya memiliki banyak dialog peringatan di aplikasi saya. Ini adalah tata letak default tetapi saya menambahkan tombol positif dan negatif ke dialog. Jadi tombol mendapatkan warna teks default Android 5 (hijau). Saya mencoba mengubahnya tanpa hasil. Adakah cara untuk mengubah warna teks itu?

Dialog Kustom saya:

public class MyCustomDialog extends AlertDialog.Builder {

    public MyCustomDialog(Context context,String title,String message) {
        super(context);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View viewDialog = inflater.inflate(R.layout.dialog_simple, null, false);

        TextView titleTextView = (TextView)viewDialog.findViewById(R.id.title);
        titleTextView.setText(title);
        TextView messageTextView = (TextView)viewDialog.findViewById(R.id.message);
        messageTextView.setText(message);

        this.setCancelable(false);

        this.setView(viewDialog);

    } }

Membuat dialog:

MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ...
                        }
}).show();

Tombol negatif itu adalah tombol dialog default dan mengambil warna hijau default dari Android 5 Lollipop.

Terimakasih banyak

Dialog khusus dengan tombol hijau

FOMDeveloper
sumber
Hampir menduplikasi pertanyaan / jawaban stackoverflow.com/a/29810469/2291 yang saya rasa lebih berlaku hari ini.
Jon Adams

Jawaban:

191

Anda dapat mencoba membuat AlertDialogobjek terlebih dahulu, lalu menggunakannya untuk mengatur untuk mengubah warna tombol dan kemudian menunjukkannya. (Perhatikan bahwa pada builderobjek alih-alih memanggil, show()kami memanggil create()untuk mendapatkan AlertDialogobjek:

//1. create a dialog object 'dialog'
MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage); 
AlertDialog dialog = builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ...
                }

            }).create();

//2. now setup to change color of the button
dialog.setOnShowListener( new OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(COLOR_I_WANT);
    }
});

dialog.show()

Alasan Anda harus melakukannya onShow()dan tidak bisa hanya mendapatkan tombol itu setelah Anda membuat dialog adalah bahwa tombol belum akan dibuat.

Saya mengubah AlertDialog.BUTTON_POSITIVEuntuk AlertDialog.BUTTON_NEGATIVEmencerminkan perubahan dalam pertanyaan Anda. Meskipun aneh bahwa tombol "OK" akan menjadi tombol negatif. Biasanya itu adalah tombol positif.

trungdinhtrong
sumber
Terima kasih atas jawaban Anda, tetapi saya tidak memiliki metode itu di AlertDialog. Lihat posting saya yang diperbarui.
FOMDeveloper
5
Metode itu di kelas AlertDialog, bukan kelas Builder. Jadi alih-alih memanggil Builder.show () Anda dapat Builder.create (), yang mengembalikan kelas AlertDialog. Anda kemudian mengatur pendengar dan kemudian memanggil show () pada objek
AlertDialog
3
Tetapi harus ada cara lain untuk melakukan ini. Sepertinya itu adalah warna dari tema, dapatkah kita mengubahnya melalui tema / gaya?
milosmns
Ini sempurna. Baru saja mencoba di Xamarin. Android dan berfungsi perfeclty. Terima kasih banyak.
perozzo
282

Berikut cara alami untuk melakukannya dengan gaya:

Jika Anda AppThemediwarisi dari Theme.MaterialComponents, maka:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#00f</item>
</style>

Jika Anda AppThemediwarisi dari Theme.AppCompat:

<style name="AlertDialogTheme" parent="ThemeOverlay.AppCompat.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#00f</item>
</style>

Gunakan AlertDialogThemedi AndaAppTheme

<item name="alertDialogTheme">@style/AlertDialogTheme</item>

atau dalam konstruktor

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)
Alexander Perfilyev
sumber
34
Saya harus mengubah buttonBarNegativeButtonStyle ke android: buttonBarNegativeButtonStyle dan buttonBarPositiveButtonStyle ke android: buttonBarPositiveButtonStyle. Kemudian berhasil (API 21+).
Vlad
23
Ingatlah untuk menggunakan android.support.v7.app.AlertDialog alih-alih android.app.AlertDialog. Kesalahan omong kosong butuh waktu 2 jam
thanhbinh84
2
Saya harus mengubah orangtua AlertDialogTheme menjadi "Base.Theme.AppCompat.Light.Dialog.Alert". Dan hapus buttonBarNegativeButtonStyle & buttonBarPositiveButtonStyle. Tambahkan juga <item name = "colorAccent"> @ color / dashboard_red_color </item> di AlertDialogTheme. dan bekerja dengan sempurna.
zephyr
3
Ini tidak berfungsi saat menggunakan perpustakaan materi baru com.google.android.material:material:1.0.0-beta01dan saya menggunakan Theme.MaterialComponents.Light.Dialog.Alert
Sanjeev
2
@LX jawaban yang diperbarui untuk memasukkan tema komponen bahan
Alexander Perfilyev
120

Warna tombol dan teks lainnya juga dapat diubah melalui tema:

values-21 / styles.xml

<style name="AppTheme" parent="...">
  ...
  <item name="android:timePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:datePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:alertDialogTheme">@style/AlertDialogCustom</item>
</style>

<style name="AlertDialogCustom" parent="android:Theme.Material.Light.Dialog.Alert">
  <item name="android:colorPrimary">#00397F</item>
  <item name="android:colorAccent">#0AAEEF</item>
</style>

Hasil:

Dialog Pemilih tanggal

Peceps
sumber
1
Saat ini saya tidak tahu cara mengubah warna kotak centang atau warna tombol saja. Warna aksen mengubah keduanya.
peceps
4
Saya menyukai pendekatan ini, tetapi saya merasa jawabannya di stackoverflow.com/a/29810469/2291 adalah cara yang sedikit lebih bersih untuk melakukannya.
Jon Adams
12
Agar ini berfungsi dalam proyek saya, saya harus menghapus android:bagian dari android:alertDialogThemedan dari android:colorAccent.
larangan geoengineering
2
Memiliki android: awalan pada nilai tergantung pada di mana Anda meletakkan styles.xml, dalam nilai atau dalam nilai-vXX
peceps
1
Untuk menjadikan ini berfungsi dengan AppCompat dan folder nilai sederhana, cukup ikuti perubahan yang disarankan oleh @ larangan-geoengineering
Felix
94

Solusi paling sederhana adalah:

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);
Artemiy
sumber
4
Bidang-bidang itu tidak boleh dirujuk dari variabel non-statis, harus berupa AlertDialog.BUTTON_NEGATIVEdll.
Joe Maher
Ini adalah cara terbaik dan paling sederhana untuk melakukan ini. Perhatikan bahwa saya tidak menggunakan "buat" melainkan mengambil dialog setelah pertunjukan (). Suka dialog AlertDialog = builder.show ();
Stephen McCormick
2
Sementara solusi ini mungkin berhasil, secara logis itu cacat. Apa yang terjadi di sini adalah Anda pertama kali menampilkan dialog, dan kemudian Anda mengubah tampilannya. Bergantung pada implementasi yang mendasarinya (yang dapat diubah seiring waktu) dan kinerja perangkat, Anda secara teoritis dapat melihat "flicker" di mana pengguna melihat dialog muncul dan kemudian dengan cepat mengubah tampilannya.
trungdinhtrong
31

Ada dua cara untuk mengubah warna tombol dialog.

Cara Dasar

Jika Anda hanya ingin mengubah suatu kegiatan, tulislah dua baris di bawah ini setelahnya alertDialog.show();

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorPrimary));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorPrimaryDark));

Direkomendasikan

Saya akan merekomendasikan menambahkan tema untuk AlertDialogdi styles.xmlsehingga Anda tidak harus menulis kode yang sama lagi dan lagi di setiap kegiatan / call dialog. Anda bisa membuat gaya dan menerapkan tema itu di kotak dialog. Jadi, setiap kali Anda ingin mengubah warna kotak AlertDialog, ubah saja warna dalam styles.xml dan semua kotak dialog akan diperbarui di seluruh aplikasi.

<style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/colorPrimary</item>
</style>

Dan terapkan tema dalam AlertDialog.Builder

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);
Hassnain Jamil
sumber
Jawaban ini adalah yang paling bersih namun tetap benar.
Big_Chair
11

Jika Anda ingin mengubah warna teks tombol (positif, negatif, netral) tambahkan saja gaya dialog khusus Anda:

<item name="colorAccent">@color/accent_color</item>

Jadi, gaya dialog Anda harus terlihat seperti ini:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:textColor">@android:color/black</item>
    <item name="colorAccent">@color/topeka_accent</item>
</style>
Stanislav Zakharov
sumber
6
<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:colorPrimary">#00397F</item>
    <item name="android:textColorPrimary">#22397F</item>
    <item name="android:colorAccent">#00397F</item>
    <item name="colorPrimaryDark">#22397F</item>
</style>

Warna tombol dan teks lainnya juga dapat diubah menggunakan appcompat:

Arade
sumber
Theme.AppCompat.Light.Dialog.Alert berfungsi dengan baik untuk mengubah warna tombol menjadi putih.
Leo K
6
  1. Dalam tema / gaya aplikasi Anda, tambahkan baris berikut:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. Kemudian tambahkan gaya berikut:

    <style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="NeutralButtonStyle" 
    parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">#00f</item>
    </style>

Menggunakan metode ini membuatnya tidak perlu untuk mengatur tema di pembangun AlertDialog.

Joe Muller
sumber
4

Sama seperti catatan tambahan:

Warna tombol (dan seluruh gaya) juga tergantung pada tema saat ini yang bisa agak berbeda saat Anda menggunakan keduanya

android.app.AlertDialog.Builder builder = new AlertDialog.Builder()

atau

android.support.v7.app.AlertDialog.Builder builder = new AlertDialog.Builder()

(Lebih baik menggunakan yang kedua)

Tobias
sumber
3

Inilah cara Anda melakukannya: Cara sederhana

// Initializing a new alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.message);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        doAction();
    }
});
builder.setNegativeButton(R.string.cancel, null);

// Create the alert dialog and change Buttons colour
AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.red));
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.blue));
        //dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.black));
    }
});
dialog.show();
MrGuy
sumber
1

bagi saya itu berbeda, saya menggunakan tema tombol

<style name="ButtonLight_pink" parent="android:Widget.Button">
      <item name="android:background">@drawable/light_pink_btn_default_holo_light</item>
      <item name="android:minHeight">48dip</item>
      <item name="android:minWidth">64dip</item>
      <item name="android:textColor">@color/tab_background_light_pink</item>
    </style>

dan karena

android: textColor

putih di sana ... saya tidak melihat teks tombol (tombol Dialog pada dasarnya juga tombol). di sana kita pergi, mengubahnya, memperbaikinya.

cV2
sumber