2019年8月6日火曜日

AlertDialog の Negative ボタンの文字色を変える

AndroidX の AlertDialog で Negative ボタンと Positive ボタンを出すと、両方文字が colorAccent の色になります。
  1. import androidx.appcompat.app.AlertDialog  
  2.   
  3. class SampleActivity : AppCompatActivity() {  
  4.   
  5.     override fun onCreate(savedInstanceState: Bundle?) {  
  6.         super.onCreate(savedInstanceState)  
  7.         setContentView(R.layout.activity_sample)  
  8.   
  9.         button.setOnClickListener {  
  10.             AlertDialog.Builder(this)  
  11.                 .setMessage("メッセージ")  
  12.                 .setNegativeButton(android.R.string.cancel, null)  
  13.                 .setPositiveButton(android.R.string.ok, null)  
  14.                 .show()  
  15.         }  
  16.     }  
  17. }  


Negative ボタンの文字色を変えるには Widget.AppCompat.Button.ButtonBar.AlertDialog を継承した style を用意し、android:textColor を指定します。
  1. <style name="Widget.Sample.Button.ButtonBar.AlertDialog.Negative" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">  
  2.     <item name="android:textColor">?android:attr/textColorSecondary</item>  
  3. </style>  
ThemeOverlay.AppCompat.Dialog.Alert を継承したテーマを用意し、その中で buttonBarNegativeButtonStyle に上で定義した style を指定します。
  1. <style name="ThemeOverlay.Sample.Dialog.Alert" parent="ThemeOverlay.AppCompat.Dialog.Alert">  
  2.     <item name="buttonBarNegativeButtonStyle">@style/Widget.Sample.Button.ButtonBar.AlertDialog.Negative</item>  
  3. </style>  
用意したテーマを AlertDialog.Builder のコンストラクタで指定するか
  1. AlertDialog.Builder(this, R.style.ThemeOverlay_Sample_Dialog_Alert)  
  2.     .setMessage("メッセージ")  
  3.     .setNegativeButton(android.R.string.cancel, null)  
  4.     .setPositiveButton(android.R.string.ok, null)  
  5.     .show()  
alertDialogTheme に指定します。
  1. <style name="Theme.Sample.Light" parent="Theme.AppCompat.Light">  
  2.     <item name="alertDialogTheme">@style/ThemeOverlay.Sample.Dialog.Alert</item>  
  3. </style>  



AppCompat の設定と解説

alertDialogStyle に指定されている AlertDialog.AppCompat をたどっていくと、
  1. <style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">  
  2.     …  
  3.     <item name="alertDialogStyle">@style/AlertDialog.AppCompat</item>  
  4. </style>  
  1. <style name="AlertDialog.AppCompat" parent="Base.AlertDialog.AppCompat"/>  
  2.   
  3. <style name="Base.AlertDialog.AppCompat" parent="android:Widget">  
  4.     <item name="android:layout">@layout/abc_alert_dialog_material</item>  
  5.     <item name="listLayout">@layout/abc_select_dialog_material</item>  
  6.     <item name="listItemLayout">@layout/select_dialog_item_material</item>  
  7.     <item name="multiChoiceItemLayout">@layout/select_dialog_multichoice_material</item>  
  8.     <item name="singleChoiceItemLayout">@layout/select_dialog_singlechoice_material</item>  
  9.     <item name="buttonIconDimen">@dimen/abc_alert_dialog_button_dimen</item>  
  10. </style>  
layout に @layout/abc_alert_dialog_material が指定されています。この中で button bar 部分は @layout/abc_alert_dialog_button_bar_material に分割されています。

これを見ると Negative Button には style="?attr/buttonBarNegativeButtonStyle" が指定されていることがわかります。

@layout/abc_alert_dialog_button_bar_material
  1. <ScrollView …>  
  2.   
  3.     <android.support.v7.widget.ButtonBarLayout  
  4.         …">  
  5.   
  6.         …  
  7.   
  8.         <Button  
  9.             android:id="@android:id/button2"  
  10.             style="?attr/buttonBarNegativeButtonStyle"  
  11.             android:layout_width="wrap_content"  
  12.             android:layout_height="wrap_content"/>  
  13.   
  14.         <Button  
  15.             android:id="@android:id/button1"  
  16.             style="?attr/buttonBarPositiveButtonStyle"  
  17.             android:layout_width="wrap_content"  
  18.             android:layout_height="wrap_content"/>  
  19.   
  20.     </android.support.v7.widget.ButtonBarLayout>  
  21.   
  22. </ScrollView>  
buttonBarNegativeButtonStyle には buttonBarButtonStyle が指定されており、buttonBarButtonStyle には Widget.AppCompat.Button.ButtonBar.AlertDialog が指定されています。
  1. <style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">  
  2.   
  3.     …  
  4.   
  5.     <item name="buttonBarButtonStyle">@style/Widget.AppCompat.Button.ButtonBar.AlertDialog</item>  
  6.     <item name="buttonBarPositiveButtonStyle">?attr/buttonBarButtonStyle</item>  
  7.     <item name="buttonBarNegativeButtonStyle">?attr/buttonBarButtonStyle</item>  
  8.     <item name="buttonBarNeutralButtonStyle">?attr/buttonBarButtonStyle</item>  
  9.   
  10. </style>  
Widget.AppCompat.Button.ButtonBar.AlertDialog は最終的に Widget.AppCompat.Button.Borderless.Colored を継承しており、これによりボタンの文字が colorAccent 色になっています。
  1. <style name="Widget.AppCompat.Button.ButtonBar.AlertDialog" parent="Base.Widget.AppCompat.Button.ButtonBar.AlertDialog"/>  
  2.   
  3. <style name="Base.Widget.AppCompat.Button.ButtonBar.AlertDialog" parent="Widget.AppCompat.Button.Borderless.Colored">  
  4.     <item name="android:minWidth">64dp</item>  
  5.     <item name="android:minHeight">@dimen/abc_alert_dialog_button_bar_height</item>  
  6. </style>  
Widget.AppCompat.Button.ButtonBar.AlertDialog を継承した style を用意し、文字色を上書きして buttonBarButtonStyle にセットすれば Negative Button の文字色を変えることができます。



0 件のコメント:

コメントを投稿