29

AlertDialog ボタンのデフォルト スタイルをオーバーライドする方法を知っている人はいますか? テーマスタイルの 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>

何か案は?

4

7 に答える 7

30

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

Steve Haley の質問のマークアップに何か問題があり、alertDialogStyle と alertDialogTheme が混同されています。

したがって、@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 が教えてくれます...

XML でアラート ダイアログ ボタンのスタイルを設定することは不可能であるという MrSnowflake の結論を検証するためのリソースはありませんが、機能が実際に欠落している Android のやや厄介な側面の 1 つに直面していない限り、その可能性は低いと思います。

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

<style name="customButtonStyle" />

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

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

于 2012-12-07T11:39:14.377 に答える
11

これを試して:

 <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>
于 2016-07-26T14:04:17.317 に答える
6

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

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
  <item name="android:buttonBarButtonStyle">@style/customButtonStyle</item>
</style>
于 2014-07-24T10:09:40.060 に答える
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);
    }
}

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

于 2015-03-24T17:51:17.280 に答える
1

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

正しくない:

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

于 2010-03-26T14:56:36.560 に答える