android 警报对话框中的按钮样式

1tuwyuhd  于 2023-03-21  发布在  Android
关注(0)|答案(8)|浏览(256)

有人知道如何覆盖AlertDialog按钮的默认样式吗?我已经浏览了themesstyles的Android源代码,并尝试了不同的东西,但我还没有找到一种有效的方法。
下面的代码可以改变背景,但对按钮没有任何作用。myTheme通过manifest应用于整个<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>

有什么想法吗?

wz8daaqr

wz8daaqr1#

考虑到Snowflake先生的推理是不准确的,我可以自由地提供另一个答案。
Steve Haley的问题中的标记错误,它混淆了alertDialogStyle和alertDialogTheme,很可能是因为alertDialogTheme是在alertDialogStyle出现很久之后才引入的。
因此,即使@android:style/Theme.Dialog.Alert在您的Andoid平台上可用,您仍然无法通过将定制版本挂钩回您自己的主题来利用其表现力,除非您的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”等提供(背景)绘图。
自定义警报对话框主题会打开一个方法来提供windowBackground、windowTitleStyle等属性,但如前所述,您需要一个支持主题的alertDialogThem属性/项的Android版本。我无法确切地说出这是何时引入的,但它还没有到Android 2.2,Eclipse无论如何都会告诉您...
我没有足够的资源来验证Snowflake先生的结论,即不可能用XML来设计警报对话框按钮的样式,但除非我们面临Android中真正缺少某个功能的令人讨厌的方面,否则我发现这是不可能的。
事实上,问题所遗漏的,正是这方面最重要的部分,即

<style name="customButtonStyle" />

所以警报对话框按钮不服从Widget.Button的结论还没有从我的Angular 得到证明。
综合结论:独立于其他小工具设置提醒对话框样式的功能在Android中受到限制,但随着新版本在这方面的改进,该功能将变得更加强大。

thigvfpy

thigvfpy2#

试试这个:

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

5kgi1eie3#

您可以重写“buttonBarButtonStyle”而不是“buttonStyle”,如下所示:

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

yks3o0rb4#

如果使用“材质组件”:

<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

acruukt9

acruukt95#

我创建了一个类似这样的方法,它将更改默认的按钮颜色和背景

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

这可能对一些人有用!

tzdcorbm

tzdcorbm6#

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

不正确:

我猜您必须实现自己的Dialog类。

zlwx9yxi

zlwx9yxi7#

这允许我自定义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();
        }
    });
    ...
}
t1qtbnec

t1qtbnec8#

在Kotlin,情况会是这样的:

private fun showDialog() =
    AlertDialog.Builder(requireContext())
        .setTitle("Title")
        .setMessage("Message")
        .setPositiveButton("OK") { _, _ ->
            // Code
        }
        .setNegativeButton("Cancel") { _, _ -> 
            // Code
        }
        .show()
        .apply {
            getButton(DialogInterface.BUTTON_POSITIVE).apply{
                setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary));
            }
            getButton(DialogInterface.BUTTON_NEGATIVE).apply{
                setTextColor(ContextCompat.getColor(requireContext(), R.color.colorSecondary));
            }
        }

相关问题