Android 5'de varsayılan iletişim düğmesi metin rengini nasıl değiştirebilirim


160

Uygulamamda birçok uyarı iletişim kutusu var. Bu varsayılan bir düzen ama iletişim kutusuna pozitif ve negatif düğmeler ekliyorum. Düğmeler Android 5'in varsayılan metin rengini (yeşil) alır. Başarısız bir şekilde değiştirmeye çalıştım. Bu metin rengini nasıl değiştireceğiniz hakkında bir fikriniz var mı?

Özel iletişim kutum:

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

    } }

İletişim kutusu oluşturma:

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

Bu negatif Düğme varsayılan bir iletişim düğmesidir ve Android 5 Lollipop'tan varsayılan yeşil rengi alır.

Çok teşekkürler

Yeşil düğmeli özel iletişim kutusu


Bu günlerde daha uygulanabilir olduğunu düşündüğüm neredeyse yinelenen soru / cevap stackoverflow.com/a/29810469/2291 .
Jon Adams

Yanıtlar:


191

Önce AlertDialognesneyi oluşturmayı deneyebilir ve sonra düğmenin rengini değiştirmek ve sonra göstermek için ayarlamak için kullanabilirsiniz. ( builderNesneyi çağırmak yerine nesneyi almak için show()çağırdığımızı unutmayın :create()AlertDialog

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

Bunu yapmanız onShow()ve iletişiminizi oluşturduktan sonra bu düğmeyi alamamanızın nedeni, düğmenin henüz oluşturulmamış olmasıdır.

Değiştim AlertDialog.BUTTON_POSITIVEiçin AlertDialog.BUTTON_NEGATIVEsorunuzu değişikliği yansıtmak için. Her ne kadar tuhaf olsa da "OK" butonu negatif buton olur. Genellikle pozitif düğmedir.


Cevap verdiğiniz için teşekkürler, ancak AlertDialog'da bu yöntem yok. Güncellenmiş yayınımı görün.
FOMDeveloper

5
Bu yöntem, Builder sınıfında değil, AlertDialog sınıfındadır. Yani, Builder.show () öğesini çağırmak yerine, AlertDialog sınıfını döndüren Builder.create () yöntemini kullanabilirsiniz. Daha sonra dinleyiciyi ayarlayıp AlertDialog nesnesinde show ()
öğesini çağırıyorsunuz

3
Ama bunu yapmanın başka bir yolu olmalı. Temadan bir renk gibi görünüyor, tema / stil aracılığıyla değiştirebilir miyiz?
milosm

Bu harika. Sadece Xamarin.Android'de denedim ve mükemmel çalışıyor. Çok teşekkür ederim.
perozzo

282

İşte stillerle yapmanın doğal bir yolu:

Eğer senin AppThemedevralınan Theme.MaterialComponentssonra:

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

Eğer senin AppThemedevralınan 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>

Kullanın AlertDialogTheme.AppTheme

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

veya kurucuda

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)

34
Android için buttonBarNegativeButtonStyle değiştirmek zorunda kaldı: buttonBarNegativeButtonStyle ve android için buttonBarPositiveButtonStyle: buttonBarPositiveButtonStyle. Sonra işe yaradı (API 21+).
Vlad

23
Android.app.AlertDialog yerine android.support.v7.app.AlertDialog kullanmayı unutmayın. Saçma hata beni 2 saat sürdü
thanhbinh84

2
AlertDialogTheme'nin üst öğesinde "Base.Theme.AppCompat.Light.Dialog.Alert" olarak değiştirmek zorunda kaldım. Ve buttonBarNegativeButtonStyle & buttonBarPositiveButtonStyle öğelerini kaldırın. Ayrıca AlertDialogTheme içine <item name = "colorAccent"> @ color / dashboard_red_color </item> ekleyin. mükemmel çalışır.
zephyr

3
Yeni malzeme kütüphanesi kullanırken bu işe yaramıyor com.google.android.material:material:1.0.0-beta01ve Theme.MaterialComponents.Light.Dialog.Alert
Sanjeev

2
@LX cevabı, malzeme bileşenleri temasını içerecek şekilde güncelledi
Alexander Perfilyev

120

Düğmelerin rengi ve diğer metinler tema ile de değiştirilebilir:

değerleri-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>

Sonuç:

diyalog Tarih seçici


1
Şu anda yalnızca onay kutusu rengini veya düğme rengini değiştirmenin bir yolunu bilmiyorum. Vurgu rengi her ikisini de değiştirir.
peceps

4
Bu yaklaşımı beğendim, ancak stackoverflow.com/a/29810469/2291 adresindeki yanıtın bunu yapmanın biraz daha temiz bir yolu olduğunu hissediyorum.
Jon Adams

12
Bunun projemde çalışmasını sağlamak için, android:parçayı android:alertDialogThemeve arkasından çıkarmak zorunda kaldım android:colorAccent.
ban-geoengineering

2
Android: değerlerin öneki olması, styles.xml, değerlere veya değerlere nereye koyacağınıza bağlıdır-vXX
peceps

1
Bu çalışmayı AppCompat ve basit değerler klasörü ile çalıştırmak için @ ban-geoengineering
Felix

94

En basit çözüm:

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);

4
Bu alanlara statik olmayan değişkenlerden referans verilmemelidir, AlertDialog.BUTTON_NEGATIVEvb.
Joe Maher

Bunu yapmanın en iyi ve en basit yolu buydu. Ben show () sonra diyalog yakaladı "oluşturma" kullanmadım unutmayın. AlertDialog gibi diyalog = builder.show ();
Stephen McCormick

2
Bu çözüm işe yarayabilirken, mantıksal olarak kusurludur. Burada olan şey, önce iletişim kutusunu gösterir ve sonra görünümünü değiştirirsiniz. Temel uygulama (zaman içinde değişebilir) ve cihazın performansına bağlı olarak, teorik olarak kullanıcının bir iletişim kutusu göründüğü ve ardından görünümünü hızla değiştirdiği bir "titreşim" görebilirsiniz.
trungdinhtrong

31

İletişim düğmesinin rengini değiştirmenin iki yolu vardır.

Temel Yolu

Bir aktivitede değiştirmek istiyorsanız, aşağıdaki iki satırı alertDialog.show();

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

Önerilen

Ben için bir tema ekleyerek önerelim AlertDialogiçinde styles.xmlher etkinlik / iletişim çağrısında tekrar tekrar aynı kodu yazmak zorunda kalmamak. Sadece bir stil oluşturabilir ve bu temayı iletişim kutusuna uygulayabilirsiniz. AlertDialog kutusunun rengini değiştirmek istediğinizde, styles.xml dosyasında rengi değiştirmeniz yeterlidir ve tüm iletişim kutuları tüm uygulamada güncellenir.

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

Ve temayı şurada uygulayın: AlertDialog.Builder

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);

Bu cevap hala doğru olurken en temizdir.
Big_Chair

11

Düğmelerin metin rengini (pozitif, negatif, nötr) değiştirmek istiyorsanız, özel iletişim stilinize ekleyin:

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

Yani, iletişim tarzınız şöyle görünmelidir:

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

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>

Düğmelerin rengi ve diğer metinler de appcompat kullanılarak değiştirilebilir:


Theme.AppCompat.Light.Dialog.Alert düğme rengini beyaza dönüştürmek için güzel çalışıyor.
Leo K

6
  1. Uygulamanızın temasına / stiline aşağıdaki satırları ekleyin:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. Ardından aşağıdaki stilleri ekleyin:

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

Bu yöntemi kullanmak, temayı AlertDialog oluşturucuda ayarlamayı gereksiz kılar.


4

Yan not olarak:

Düğmelerin (ve tüm stilin) ​​renkleri, mevcut temaya da bağlıdır.

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

veya

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

(İkincisini kullanmak daha iyi)


3

Bunu nasıl yapacağınız aşağıda açıklanmıştır: Basit yol

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

1

benim için farklıydı, bir düğme teması kullandım

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

ve çünkü

android: textColor

orada beyazdı… herhangi bir düğme metni görmedim (İletişim düğmeleri temelde düğmelerdir). İşte başlıyoruz, değiştirdik, düzelttik.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.