web-dev-qa-db-ja.com

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

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

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

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

そして、私が使用しているテーマ

Theme.MaterialComponents.Light.NoActionBar

そのメモで述べられているとおりに、AlertDialog ButtonsをMaterialButtonsに置き換えますが、問題はデフォルトでMaterialButtonsが背景色になり、ボタンが次のようになることです: enter image description here

どうすればボーダーレスやバックグラウンドレスにできますか?

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

Android.app.AlertDialog.Builder
34
antanas_sepikas

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

androidx.appcompat.app.AlertDialog

これに切り替えると、すべてが期待どおりに動作し始めました。私が解決策を見つけた場所は次のとおりです。

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

48
antanas_sepikas

com.google.Android.material:material:1.0.0およびandroidx.appcompat.app.AlertDialogを使用する場合、Widget.MaterialComponents.Button.TextButtonを親として使用して、buttonBarの各ボタンをカスタマイズできます。

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>

Screenshot

25
Rob

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>

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

4
fenceking

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"/>

1
Sylvain Lagache

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

1