有谁知道如何覆盖AlertDialog按钮的默认样式?我查看了themes和styles的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>
有什么想法吗?
答案 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();
}
});
...
}