AlertDialog中的按钮样式

时间:2010-03-26 14:41:09

标签: android alertdialog

有谁知道如何覆盖AlertDialog按钮的默认样式?我查看了themesstyles的Android来源,并尝试了不同的方法,但我找不到有效的方法。

我在下面所做的工作是改变背景,但对按钮没​​有任何作用。 myTheme通过清单应用于整个<application>。 (为清楚起见,删除了其他一些项目,但它们仅与标题栏相关。)

<style name="myTheme" parent="android:Theme">
    <item name="android:buttonStyle">@style/customButtonStyle</item>
    <item name="android:alertDialogStyle">@style/dialogAlertTheme</item>
</style>

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
    <item name="android:fullDark">@drawable/dialog_loading_background</item>
    <item name="android:topDark">@drawable/dialog_alert_top</item>
    <item name="android:centerDark">@drawable/dialog_alert_center</item>
    <item name="android:bottomDark">@drawable/dialog_alert_bottom</item>
    <!-- this last line makes no difference to the buttons -->
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
</style>

有什么想法吗?

7 个答案:

答案 0 :(得分:27)

鉴于MrSnowflake先生的推理不准确,我可以自由地提供另一个答案。

在Steve Haley的问题中,标记存在错误,并且它混合了alertDialogStyle和alertDialogTheme,很可能是因为alertDialogTheme很久以后被引入了alertDialogStyle就在附近。

所以,即使你的Andoid平台上有@android:style / Theme.Dialog.Alert,你仍然无法通过将一个cusomized版本挂回到你自己的主题来利用它的表现力,除非你的Android平台支持 android:alertDialogTheme 属性/项目的主题。 (这种不一致的Android版本可能存在也可能不存在,我不确定。但问题中使用的标记表明它确实存在。)

在问题的标记中,parent =“@ android:style / Theme.Dialog.Alert”将不执行任何操作,除非创建一个错误,即您在自定义警报对话框主题时实际上只是自定义警告对话框样式。

这就是标记的样子;并非所有Android版本都支持所有功能。

<style name="myTheme" parent="android:Theme">
    <item name="android:buttonStyle">@style/customButtonStyle</item>
    <item name="android:alertDialogStyle">@style/dialogAlertStyle</item>
    <item name="android:alertDialogTheme">@style/dialogAlertTheme</item>
</style>

<style name="dialogAlertStyle" parent="@android:style/AlertDialog">
    <item name="android:fullDark">[...]</item>
    [...]
</style>

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
    <item name="android:windowBackground">[...]</item>
    [...]
</style>

自定义警告对话框样式已经存在了很长时间,但仅限于为“fullDark”,“topDark”等提供(背景)drawable。

自定义警告对话框主题会打开一个方法来提供诸如windowBackground,windowTitleStyle等属性,但如前所述,您需要一个Android版本,它支持主题的alertDialogThem属性/项目。我无法弄清楚这是什么时候引入的,但它不是Android 2.2,Eclipse无论如何都会告诉你......

我没有足够的资源来验证MrSnowflake的结论,即在XML中设置警报对话框按钮的方式是不可能的,但除非我们面临Android的一些有些令人讨厌的方面,其中一个功能真的缺失,我发现它不太可能

事实上,问题中缺少的是这方面最相关的部分,即

<style name="customButtonStyle" />

所以警告对话框按钮不遵守Widget.Button的结论尚未从我的角度证明。

综合结论:独立于其他小部件设置警报对话框的能力在Android中受到限制,但随着新版本在这方面的改进而变得更强大。

答案 1 :(得分:10)

试试这个:

 <item name="buttonBarStyle">@style/Widget.AppCompat.ButtonBar</item>
    <item name="buttonBarButtonStyle">@style/AppTheme.Button</item>
    <item name="buttonBarPositiveButtonStyle">@style/YoursTheme</item>
    <item name="buttonBarNegativeButtonStyle">@style/YoursTheme</item>
    <item name="buttonBarNeutralButtonStyle">@style/YoursTheme</item>

答案 2 :(得分:3)

你可以覆盖&#34; buttonBarButtonStyle&#34;而不是&#34; buttonStyle&#34;像这样:

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
  <item name="android:buttonBarButtonStyle">@style/customButtonStyle</item>
</style>

答案 3 :(得分:2)

我做了一个这样的方法,它将改变默认的按钮颜色和背景

public static void setDefaultColorTextForDialogButton(AlertDialog alertDialog, Resources r) {
    Button b;

    b= alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
    if(b != null) {
        b.setTextColor(r.getColor(R.color.default_text));
        b.setBackgroundColor(Color.WHITE);
    }
    b = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
    if(b != null) {
        b.setTextColor(r.getColor(R.color.default_text));
        b.setBackgroundColor(Color.WHITE);
    }
    b = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
    if(b != null) {
        b.setTextColor(r.getColor(R.color.default_text));
        b.setBackgroundColor(Color.WHITE);
    }
}

这可能对某些人有用!!!

答案 4 :(得分:2)

如果您使用的是材料组件:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:alertDialogTheme">@style/AlertDialogTheme.Light</item>
</style>

<style name="AlertDialogTheme.Light" parent="ThemeOverlay.MaterialComponents.Dialog.Alert" >
    <item name="android:buttonBarButtonStyle">@style/InsertCustomButtonStyleHere</item>
</style>

这将保留您主题的颜色,但替换按钮的样式,例如匹配Widget.MaterialComponents.Button.TextButton

答案 5 :(得分:0)

请参阅下面的所有其他答案。

<强>错误地:

我想你必须实现自己的Dialog类。

答案 6 :(得分:0)

这让我可以自定义 AlertDialog 按钮和布局。

private void openLookupTableEditDialog() {
    AlertDialog.Builder openLookupTableEditDialog = new AlertDialog.Builder(this);
    View v = this.getLayoutInflater().inflate(R.layout.lookup_table_edit_dialog, null);

    openLookupTableEditDialog.setView(v);
    final AlertDialog alert = openLookupTableEditDialog.create();
    openLookupTableEditDialog.setTitle("Lookup Table Edit");
    Button btnSpecies = v.findViewById(R.id.btnSpeciesLookupEdit);
    Button btnLocation = v.findViewById(R.id.btnLocationLookupEdit);
    Button btnSampler = v.findViewById(R.id.btnSamplerLookupEdit);
    Button btnExit = v.findViewById(R.id.btnCloseLookupTableEdit);
    alert.setView(v);
    alert.show();

    btnSpecies.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            editSpeciesTable();
            alert.dismiss();
        }
    });
    btnSampler.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            editSamplerTable();
            alert.dismiss();
        }
    });
    btnLocation.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            editLocationTable();
            alert.dismiss();
        }
    });
    btnExit.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
           alert.dismiss();
        }
    });
    ...
}