Android 5でデフォルトのダイアログボタンのテキストの色を変更するにはどうすればよいですか


160

アプリに警告ダイアログがたくさんあります。これはデフォルトのレイアウトですが、ダイアログに正と負のボタンを追加しています。そのため、ボタンはAndroid 5(緑)のデフォルトのテキスト色を取得します。私はそれを変えようとしたが成功しなかった。テキストの色を変更する方法はありますか?

私のカスタムダイアログ:

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

    } }

ダイアログの作成:

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

そのnegativeButtonはデフォルトのダイアログボタンであり、Android 5 Lollipopのデフォルトの緑色を使用します。

どうもありがとう

緑色のボタンが付いたカスタムダイアログ


最近では、ほとんど重複する質問/回答stackoverflow.com/a/29810469/2291がより適切に思えます。
Jon Adams

回答:


191

AlertDialog最初にオブジェクトを作成してから、それを使用してボタンの色を変更してから表示するように設定できます。(builderオブジェクトではなく、オブジェクトを取得するために呼び出すshow()ので注意してください: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()

あなたがそれをしなければならない理由 onShow()と、あなたのダイアログを作成した後、ちょうどそのボタンを取得することはできませんが、ボタンがまだ作成されていないということです。

私は変更AlertDialog.BUTTON_POSITIVEすることがAlertDialog.BUTTON_NEGATIVEあなたの質問の変更を反映します。「OK」ボタンがネガティブボタンになるのは奇妙ですが。通常は正のボタンです。


回答ありがとうございます。ただし、AlertDialogにはそのメソッドはありません。私の更新された投稿を参照してください。
FOMDeveloper 2015年

5
そのメソッドは、BuilderクラスではなくAlertDialogクラスにあります。したがって、Builder.show()を呼び出す代わりに、AlertDialogクラスを返すBuilder.create()を使用できます。次に、リスナーをセットアップし、AlertDialogオブジェクトでshow()を呼び出します
trungdinhtrong

3
しかし、これを行うには別の方法が必要です。テーマの色のようですが、テーマやスタイルで変えられますか?
milosmns 2015年

これは完璧です。Xamarin.Androidで試したところ、問題なく動作しました。どうもありがとうございました。
ペロッツォ2018

282

スタイルでそれを行う自然な方法は次のとおりです。

AppThemeがから継承されている場合Theme.MaterialComponents

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

AppThemeから継承された場合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>

AlertDialogThemeであなたを使うAppTheme

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

またはコンストラクタ内

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

34
buttonBarNegativeButtonStyleをandroid:buttonBarNegativeButtonStyleに、buttonBarPositiveButtonStyleをandroid:buttonBarPositiveButtonStyleに変更する必要がありました。その後、機能しました(API 21以降)。
Vlad

23
android.app.AlertDialogの代わりにandroid.support.v7.app.AlertDialogを使用することを忘れないでください。でたらめの間違いは私に2時間かかりました
thanhbinh84

2
AlertDialogThemeの親を「Base.Theme.AppCompat.Light.Dialog.Alert」に変更する必要がありました。そして、buttonBarNegativeButtonStyleとbuttonBarPositiveButtonStyleを削除します。AlertDialogThemeの<item name = "colorAccent"> @ color / dashboard_red_color </ item>にも追加します。ndは完全に動作します。
ゼファー2018

3
新しいマテリアルライブラリcom.google.android.material:material:1.0.0-beta01を使用していて、Theme.MaterialComponents.Light.Dialog.Alertを使用している場合、これは機能しません
Sanjeev

2
@LXが回答を更新してマテリアルコンポーネントテーマを
追加

120

ボタンやその他のテキストの色もテーマを介して変更できます:

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>

結果:

ダイアログ 日付ピッカー


1
現在、チェックボックスの色またはボタンの色のみを変更する方法はわかりません。どちらもアクセントカラーが変わります。
ペセプス

4
私はこのアプローチが好きでしたが、stackoverflow.com / a / 29810469/2291での答えは少しクリーンな方法だと思います。
Jon Adams

12
これを私のプロジェクトで機能させるには、からandroid:パーツをから削除する必要がandroid:alertDialogThemeありましたandroid:colorAccent
ban-geoengineering

2
値にandroid:プレフィックスを付けるかどうかは、styles.xmlを値または値-vXXのどこに配置するかに依存します
peceps

1
AppCompatと単純な値フォルダでこれを機能させるには、@ ban-geoengineeringによって提案された変更に従うだけです
Felix

94

最も単純なソリューションは次のとおりです。

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

4
これらのフィールドであるべきで、非静的変数から参照されるべきではないAlertDialog.BUTTON_NEGATIVE
ジョーマー

これは、これを行うための最良かつ最も簡単な方法でした。「作成」は使用せず、show()の後にダイアログを取得したことに注意してください。AlertDialogダイアログ= builder.show();
スティーブンマコーミック2017年

2
このソリューションは機能するかもしれませんが、論理的には問題があります。ここで何が起こるかは、最初にダイアログを表示し、次にその外観を変更することです。基本的な実装(時間の経過とともに変更される可能性があります)とデバイスのパフォーマンスによっては、理論的には、ユーザーがダイアログを表示してその外観をすばやく変更する「フリッカー」を確認できます。
trungdinhtrong 2017

31

ダイアログボタンの色を変更するには、2つの方法があります。

基本的な方法

アクティビティを変更するだけの場合は、以下の2行を書き込んでください alertDialog.show();

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

オススメ

私はのためにテーマを追加することをお勧めしますAlertDialogstyles.xmlは、各アクティビティ/ダイアログの呼び出しで何度も何度も同じコードを記述する必要はありませんので。スタイルを作成して、ダイアログボックスにそのテーマを適用するだけです。したがって、AlertDialogボックスの色を変更する場合は、styles.xmlで色を変更するだけで、すべてのダイアログボックスがアプリケーション全体で更新されます。

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

そしてテーマを適用します AlertDialog.Builder

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

この答えは、正しい間は最もクリーンです。
Big_Chair

11

ボタンのテキストの色(ポジティブ、ネガティブ、ニュートラル)を変更する場合は、カスタムダイアログスタイルに追加するだけです。

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

したがって、ダイアログスタイルは次のようになります。

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

ボタンやその他のテキストの色もappcompatを使用して変更できます。


Theme.AppCompat.Light.Dialog.Alertはボタンの色を白に変更するためにうまく機能します。
Leo K

6
  1. アプリのテーマ/スタイルに、次の行を追加します。

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. 次に、次のスタイルを追加します。

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

このメソッドを使用すると、AlertDialog Builderでテーマを設定する必要がなくなります。


4

補足として:

ボタンの色(およびスタイル全体)は、現在のテーマにも依存します。どちらかを使用すると、かなり異なる場合があります。

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

または

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

(2番目のものを使用することをお勧めします)


3

方法は次のとおりです。シンプルな方法

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

僕にとっては違う、ボタンのテーマを使った

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

そして、

android:textColor

そこは白かった…ボタンのテキストは表示されなかった(ダイアログボタンも基本的にはボタンです)。そこに行き、変更し、修正しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.