MaterialComponentsテーマアラートダイアログボタン


83

最近、サポートライブラリからcom.google.android.material:material:1.0.0に切り替えました

しかし今、私は問題を抱えています、このページにはメモがありますhttps://github.com/material-components/material-components-android/blob/master/docs/getting-started.md

注:マテリアルコンポーネントテーマを使用すると、デフォルトのコンポーネントを対応するマテリアルに置き換えるカスタムビューインフレータが有効になります。現在、これはButtonXMLコンポーネントをMaterialButtonに置き換えるだけです。

そして私が使っているテーマ

Theme.MaterialComponents.Light.NoActionBar

そのメモに書かれていることを正確に実行し、AlertDialogボタンをMaterialButtonsに置き換えますが、問題は、デフォルトでMaterialButtonsが背景色になり、ボタンが次のようになることです。 ここに画像の説明を入力してください

どうすればそれらをボーダレスおよびバックグラウンドレスに戻すことができますか?

PSアラートビルダーを使用してアラートダイアログを作成しています:

android.app.AlertDialog.Builder

AppCompatテーマのコンテンツにいくつかの新しいマテリアルUIスタイルが必要な場合は、Bridgeテーマを使用できます。問題を解決できます。この回答を参照してください:stackoverflow.com/a/52401497/10271334
JeelVankhede18年

回答:


114

私はこの問題の原因を突き止めました。別のAlertDialogクラスを使用する必要があります。

androidx.appcompat.app.AlertDialog

これに切り替えると、すべてが期待どおりに機能し始めました。これが私が解決策を見つけたところです:

https://github.com/material-components/material-components-android/issues/162


2
AndroidStudioの「MigratetoAndroidX」オプション/機能を使用してコードをandroidxに移行しましたが、このライブラリはAndroidXに自動的に更新されませんでした。私にとってこの問題は、答えが示すようにインポートを手動で更新したときに解決されました
sushrut6 1919

1
あなたは私を救う!ありがとう!
マテウス

すべての英雄はマントを着用していません!
dave ogrady20年

真夜中の少し前に大いに感謝します。あなたは私に1時間の睡眠を節約しました。
ナントカ

76

使用している場合com.google.android.material:material:1.0.0androidx.appcompat.app.AlertDialog、あなたは内の各ボタンをカスタマイズすることができますbuttonBar使用することによりWidget.MaterialComponents.Button.TextButton、親として。

val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(context, R.style.AlertDialogTheme))

デフォルトのレイアウトを使用するか、カスタムを追加します builder.setView(R.layout.my_dialog)

あなたのスタイルで:

<style name="AlertDialogTheme" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
    <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Neutral</item>
    <item name="buttonBarNeutralButtonStyle">@style/Alert.Button.Neutral</item>
</style>

<style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/colorPrimary</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textAllCaps">false</item>
</style>

<style name="Alert.Button.Neutral" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/gray_dark</item>
    <item name="android:textSize">14sp</item>
</style>

スクリーンショット


1
これは、ダイアログのスタイルを設定しようとしたときに探していたものです。私が見つけたすべての答えはAndroidXを使用していませんでした。
LeonardoSibela

2
textAllCapsをfalseに設定している理由がわかりません。私は通常、それは(唯一の例外は、Googleからの材料設計の例では、クレーンと呼ばれていました)ダイアログ上でtrueに設定参照
LeonardoSibela

5
これを50回賛成できたらいいのにと思います。私は2時間ほど、愚かなダイアログに色を付けようとしていました。MaterialAlertDialogBuilder代わりに使用する必要があることに注意してください。
gMale

1
@gMaleのコメントは私にとって時間を節約しました。
funct7

1
これは本当に助けてくれてありがとう!
グリスグラム

21

マテリアルコンポーネントライブラリAlertDialogを使用している場合は、を使用するのが最善の方法MaterialAlertDialogBuilderです。

new MaterialAlertDialogBuilder(context)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

これはデフォルトの結果です:

ここに画像の説明を入力してください

ボタンに別のスタイルや色を適用したい場合は、この回答を確認してください。


に置き換えAlertDialog.BuilderMaterialAlertDialogBuilderもボタンの色は変わりませんでした。を変更するには、以下の回答を参照してくださいtheme
CoolMind

@CoolMind問題は、ボタンの色を変更する方法ではありません。
GabrieleMariotti20年

13

私は上記の答えをテストしました。私は良い考えを思いついたが、私の場合はどれもうまくいかなかった。だから、これが私の答えです。

  1. android:theme="@style/AppMaterialTheme"マニフェストファイルの[アプリケーション]または[アクティビティ]の下にあることを確認してください。

  2. Styles.xmlファイルを開き、以下に基づいて変更します。

    <style name="AppMaterialTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primaryBlue</item>
        <item name="colorPrimaryDark">@color/primaryBlue</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="colorControlActivated">@color/primaryBlue</item>
        <item name="colorControlHighlight">@color/colorAccent_main</item>
        <item name="colorButtonNormal">@color/white</item>
    
        <item name="materialAlertDialogTheme">@style/AlertDialogMaterialTheme</item>
    </style>
    
    <style name="AlertDialogMaterialTheme" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
        <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
        <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Negative</item>
    </style>
    
    <style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.UnelevatedButton">
        <item name="android:fillColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/white</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    
    <style name="Alert.Button.Negative" parent="Widget.MaterialComponents.Button.OutlinedButton">
        <item name="strokeColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/color_0054BB</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="android:layout_marginEnd">8dp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    

  3. アクティビティがテーマを適用するため、AlertDialogにテーマを適用する必要はありません。したがって、通常どおりダイアログを作成します。

ここに画像の説明を入力してください

結果はになります。

ここに画像の説明を入力してください


「buttonBarPositiveButtonStyle」が機能しない理由はわかりませんが、「android:buttonBarPositiveButtonStyle」は正しく機能しています。
LukaszTaraszka

スタイルはPositiveButtonには適用されません。ネガティブのものも同じです。
LukaszTaraszka

11

まず、MaterialAlertDialogを使用することをお勧めしますあなたは素材のテーマを使用している場合。

詳細はこちら–Material.io→テーマダイアログ

ここに画像の説明を入力してください

MaterialAlertDialogBuilder(context)
            .setTitle(R.string.confirm)
            .setMessage(R.string.logout)
            .setPositiveButton(R.string.logout_alert_positive) { _, _ -> activity?.logout() }
            .setNegativeButton(R.string.never_mind, null)
            .show()

 

これは、MaterialAlertDialogアクションのlayout.xmlです。ご覧のとおり、3つのボタンがあり、それぞれに独自のスタイルがあります。だから、これがあなたがそれらを変えることができる方法です。

ステップ1:デフォルトのMaterialAlertDialogテーマを変更することをAndroidに伝えます。

<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    ...
    <item name="materialAlertDialogTheme">@style/AlertDialog</item>
    ...
</style>

ステップ2:特定のボタンスタイルを変更することをAndroidに伝えます。buttonBarNeutralButtonStylebuttonBarNegativeButtonStyleまたはbuttonBarPositiveButtonStyle

<style name="AlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
</style>

ステップ3:カスタムスタイルを定義する

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">#FF0000</item>
</style>

6

ここでMaterialComponentsを使用して、これに対する別の解決策を見つけました:https//issuetracker.google.com/issues/116861837#comment9

<style name="Theme.Custom.Material.Alert.Dialog.Light" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="materialButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
</style>

<style name="Theme.Custom.Material.Base.Light" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:dialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
    <item name="android:alertDialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
  ....
</style>

それはまだ私にとって「意図された行動」ではありませんが。


5

を使用したくない場合androidx.appcompat.app.AlertDialogは、ダイアログボタンのスタイルを再定義するだけです。

あなたのstyle.xmlで:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
   ...
   <item name="android:buttonBarButtonStyle">@style/DialogButton</item>
   ...
</style>

<style name="DialogButton" parent="Widget.MaterialComponents.Button.TextButton"/>


4

com.android.support:design:28.0.0ライブラリを使用している場合、使用android.support.v7.app.AlertDialogは期待どおりに機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.