appCompat 22.1以降の新しいAlertDialogを使用してスタイルを設定する方法


154

デフォルトのandroid AlertDialogからappCompat-22.1に含まれる新しいandroidに移行しようとしています。これまでのところ、android.support.v7.app.AlertDialogパッケージをインポートするだけで使用できることを理解しています。

しかし、どのようにスタイルを設定できますか?たとえば、正/負のボタンの色、タイトルの色、メッセージの色、背景色を変更しますか?

回答:


448

作成時に、AlertDialog使用するテーマを設定できます。

例-ダイアログの作成

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-カスタムスタイル

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

結果

スタイル付きアラートダイアログ

編集する

タイトルの外観を変更するには、次の操作を実行できます。最初に新しいスタイルを追加します。

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

その後、単にあなたの中でこのスタイルを参照してくださいMyAlertDialogStyle

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

このようにして、スタイルを介してtextColorメッセージにandroid:textColorPrimary別のタイトルを、タイトルに別のを定義できます。


2
@reVerseありがとうございます。多くのライブラリでは、タイトルとテキストの色を変えることができます。これがここでも可能かどうか知っていますか?
ThanosFisherman 2015

3
やあまた会ったね!メッセージのテキストサイズを変更する方法はありますか?
ThanosFisherman 2015

1
@ThanosF残念ながら、これを行うxml属性は知りません。しかし、それは確かにJavaコードを介して可能です。
2015

2
@summers Jup。これは基本的にはappcompat-v7、新しいコンポーネントの下位互換性をAPIレベル7(Android 2.1)に
引き下げる

1
ボタンのテキストの色を21以上で機能させるには、android:buttonStyleアイテムを "MyAlertDialogStyle"に設定し、android:textColorアイテムをカスタムボタンスタイルに設定する必要がありました。
Tim Autin

61

すべてのアプリケーションにテーマを使用し、2番目のパラメーターを使用してダイアログのスタイルを設定しない

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

テーマでカラーアクセントを使用するアプリで、alertDialogのボタンにテーマcolorAccentが表示されないテーマにダイアログスタイルを追加する必要があります。


API 10(android 2.3)では機能せず、おそらくAPI 11+でのみ機能します。
Oliv 2015年

2
たぶん、API 15以降。私は新しいプロジェクトをAPI 15+でのみ開始します。4より前のAndroidは2015
。– neoteknic

@Oliv依存関係com.android.support:design:23.2.1を使用してAPI 10で動作します
通行人

IDEAは、「com.android.support:design:22.2.1」を使用してBase.Theme.AppCompat.Light.Dialog.AlertでcolorAccentを使用するにはAPI 21+が必要であると述べています
Felipe Andrade

@Felipe Andrade Alwayは最新のSDKバージョンをターゲットにしており、動作するはずです!私は最小API 15とターゲット25のデザインのプロジェクトを持っています:22.xは廃止され、25.1.x以上を使用します
neoteknic

19

新しいandroid.support.v7.app.AlertDialogを使用し、ボタンに異なる色を使用し、カスタムレイアウトも使用する場合は、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;
}

ここに画像の説明を入力してください


それは素晴らしいことです!ありがとう
ThanosFisherman

おかげで、これが私にとってうまくいった唯一の方法ですが、チェックボックスの色もどのようにして取得できるのか教えていただけますか?私のアプリには、で作成されたラジオボタンのリストを含むダイアログがありますBuilder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)。アダプターをサブクラス化し、そこでビューを調整することはしたくありません。
Gabor 2016年

重砲は常に機能します!これを使用して、常にアクセントカラーへの変更を拒否する2つの反逆ボタンを処理する必要がありました。
rupps

7

@reVerseの回答に従ってくださいが、私の場合、私はすでにいくつかのプロパティがAppTheme好きでした

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

だから私のダイアログは次のようになります
ここに画像の説明を入力してください

私はそれを解決しました

1)インポートandroid.app.AlertDialogandroid.support.v7.app.AlertDialog
2に変更します。2)プロパティAppThemeをnull値でオーバーライドします。

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

それが他の人々を助けることを願って

ここに画像の説明を入力してください


あ、ありがとう!サポートAlertDialogを使用していませんでした。
masterwok 2018

1

私のような場合は、AppCompatの一部の色を変更するだけで、ダイアログで一意に変更する必要がある唯一の色は背景です。次に、に色を設定するだけですcolorBackgroundFloating

これは、ネストされたテーマなしでいくつかの色を単に変更する私の基本的なテーマです:

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

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