web-dev-qa-db-ja.com

AlertDialogsのボタンスタイル

AlertDialogボタンのデフォルトスタイルをオーバーライドする方法を知っている人はいますか? Android themes および styles のソース)を調べ、さまざまなことを試しましたが、見つけることができませんでしたその方法。

以下で取得したものは、背景を変更するために機能しますが、ボタンでは何もしません。 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>

何か案は?

23
Steve Haley

以下の他のすべてのアンサーを参照してください。

不正解:

独自のDialogクラスを実装する必要があると思います。

0
MrSnowflake

MrSnowflakeの推論が不正確であることを考えると、私は自由に別の答えを提供しています。

Steve Haleyの質問にwrongmarkupがあり、alertDialogStyleとalertDialogThemeが混同しています。 。

Andoidプラットフォームで@Android:style/Theme.Dialog.Alertを使用できる場合でも、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などの属性を提供するメソッドが開きますが、前述のように、AndroidテーマのalertDialogThem属性/アイテムをサポートするバージョンが必要です。これがいつ導入されたのか正確には分かりませんが、Android 2.2ではありません。Eclipseはとにかく教えてくれます...

XMLでアラートダイアログボタンのスタイルを設定することは不可能であるというMrSnowflakeの結論を検証するためのリソースはありませんが、Android行方不明、それはほとんどありません。

実際のところ、質問に欠けているのは、この点で最も関連性の高い部分です。

<style name="customButtonStyle" />

したがって、アラートダイアログボタンがWidget.Buttonに従わないという結論は、私の観点からはまだ証明されていません。

統合された結論:他のウィジェットとは独立してアラートダイアログのスタイルを設定する機能は、Androidで制限されていますが、この点で新しいバージョンが向上するにつれて、より強力になります。

29
class stacker

これを試して:

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

次のように、「buttonStyle」の代わりに「buttonBarButtonStyle」をオーバーライドできます。

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

Material Componentsを使用している場合:

<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

3
Peter Keefe

私はデフォルトのボタンの色と背景を変更するこのような方法を作りました

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

これは一部の人に役立つかもしれません!!!