如何使用appCompat 22.1及更高版本中的新AlertDialog并为其设置样式


154

我正在尝试从默认android迁移AlertDialog到appCompat-22.1中包含的新android ,到目前为止,我了解到您只需要导入android.support.v7.app.AlertDialog软件包即可使用它。

但是我该如何设计呢?例如,更改正/负按钮颜色,标题颜色,消息颜色和背景颜色?

Answers:


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

3
又见面了!有没有办法更改邮件的文本大小?
ThanosFisherman 2015年

1
@ThanosF不幸的是,我不知道执行此操作的任何xml属性。但是通过Java代码肯定有可能。
reVerse

2
@summers Jup。这基本上是一个想法appcompat-v7-将较新组件的向后兼容性降低到API级别7(Android 2.1)
reVerse

1
为了使按钮的文本颜色能在21+上正常工作,我必须将android:buttonStyle项目设置为“ MyAlertDialogStyle”,并在自定义按钮样式中使用android:textColor项目。
Tim Autin

61

要为所有应用程序使用主题,并且不要使用第二个参数来设置对话框的样式

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

在主题中使用颜色强调的应用程序上,不要显示主题为colorAccent的alertDialog的按钮,我必须在主题中添加对话框样式。


不适用于API 10(android 2.3),可能仅适用于API 11+。
奥利夫,2015年

2
也许使用API​​ 15+。我仅在API 15+上启动新项目,我认为2015
。– neoteknic

@Oliv它确实使用依赖项com.android.support:design:23.2.1在API 10上正常工作
路人

IDEA要求API 21+必须在使用'com.android.support:design:22.2.1'的Base.Theme.AppCompat.Light.Dialog.Alert上使用colorAccent
Felipe Andrade

@Felipe Andrade Alway始终以最新的SDK版本为目标,应该可以使用!我有一个带有最小api 15和目标25设计的projet: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 2015年

谢谢,这是它对我有用的唯一方法,但是您能告诉我如何获取复选框的颜色吗?在我的应用程序中,有一个对话框,其中包含通过创建的单选按钮列表Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)。我不想深入探讨适配器的子类并在那里调整视图。
加博尔

重型大炮始终有效!我不得不使用它来照顾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)我AppTheme用空值覆盖2属性

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

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.