AndroidX の AlertDialog で Negative ボタンと Positive ボタンを出すと、両方文字が colorAccent の色になります。
- import androidx.appcompat.app.AlertDialog
-
- class SampleActivity : AppCompatActivity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_sample)
-
- button.setOnClickListener {
- AlertDialog.Builder(this)
- .setMessage("メッセージ")
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(android.R.string.ok, null)
- .show()
- }
- }
- }
import androidx.appcompat.app.AlertDialog
class SampleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sample)
button.setOnClickListener {
AlertDialog.Builder(this)
.setMessage("メッセージ")
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}
}
Negative ボタンの文字色を変えるには Widget.AppCompat.Button.ButtonBar.AlertDialog を継承した style を用意し、android:textColor を指定します。
- <style name="Widget.Sample.Button.ButtonBar.AlertDialog.Negative" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
- <item name="android:textColor">?android:attr/textColorSecondary</item>
- </style>
<style name="Widget.Sample.Button.ButtonBar.AlertDialog.Negative" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
ThemeOverlay.AppCompat.Dialog.Alert を継承したテーマを用意し、その中で buttonBarNegativeButtonStyle に上で定義した style を指定します。
- <style name="ThemeOverlay.Sample.Dialog.Alert" parent="ThemeOverlay.AppCompat.Dialog.Alert">
- <item name="buttonBarNegativeButtonStyle">@style/Widget.Sample.Button.ButtonBar.AlertDialog.Negative</item>
- </style>
<style name="ThemeOverlay.Sample.Dialog.Alert" parent="ThemeOverlay.AppCompat.Dialog.Alert">
<item name="buttonBarNegativeButtonStyle">@style/Widget.Sample.Button.ButtonBar.AlertDialog.Negative</item>
</style>
用意したテーマを AlertDialog.Builder のコンストラクタで指定するか
- AlertDialog.Builder(this, R.style.ThemeOverlay_Sample_Dialog_Alert)
- .setMessage("メッセージ")
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(android.R.string.ok, null)
- .show()
AlertDialog.Builder(this, R.style.ThemeOverlay_Sample_Dialog_Alert)
.setMessage("メッセージ")
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok, null)
.show()
alertDialogTheme に指定します。
- <style name="Theme.Sample.Light" parent="Theme.AppCompat.Light">
- <item name="alertDialogTheme">@style/ThemeOverlay.Sample.Dialog.Alert</item>
- </style>
<style name="Theme.Sample.Light" parent="Theme.AppCompat.Light">
<item name="alertDialogTheme">@style/ThemeOverlay.Sample.Dialog.Alert</item>
</style>
AppCompat の設定と解説
alertDialogStyle に指定されている AlertDialog.AppCompat をたどっていくと、
- <style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">
- …
- <item name="alertDialogStyle">@style/AlertDialog.AppCompat</item>
- </style>
<style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">
…
<item name="alertDialogStyle">@style/AlertDialog.AppCompat</item>
</style>
- <style name="AlertDialog.AppCompat" parent="Base.AlertDialog.AppCompat"/>
-
- <style name="Base.AlertDialog.AppCompat" parent="android:Widget">
- <item name="android:layout">@layout/abc_alert_dialog_material</item>
- <item name="listLayout">@layout/abc_select_dialog_material</item>
- <item name="listItemLayout">@layout/select_dialog_item_material</item>
- <item name="multiChoiceItemLayout">@layout/select_dialog_multichoice_material</item>
- <item name="singleChoiceItemLayout">@layout/select_dialog_singlechoice_material</item>
- <item name="buttonIconDimen">@dimen/abc_alert_dialog_button_dimen</item>
- </style>
<style name="AlertDialog.AppCompat" parent="Base.AlertDialog.AppCompat"/>
<style name="Base.AlertDialog.AppCompat" parent="android:Widget">
<item name="android:layout">@layout/abc_alert_dialog_material</item>
<item name="listLayout">@layout/abc_select_dialog_material</item>
<item name="listItemLayout">@layout/select_dialog_item_material</item>
<item name="multiChoiceItemLayout">@layout/select_dialog_multichoice_material</item>
<item name="singleChoiceItemLayout">@layout/select_dialog_singlechoice_material</item>
<item name="buttonIconDimen">@dimen/abc_alert_dialog_button_dimen</item>
</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
- <ScrollView …>
-
- <android.support.v7.widget.ButtonBarLayout
- …">
-
- …
-
- <Button
- android:id="@android:id/button2"
- style="?attr/buttonBarNegativeButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- <Button
- android:id="@android:id/button1"
- style="?attr/buttonBarPositiveButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
- </android.support.v7.widget.ButtonBarLayout>
-
- </ScrollView>
<ScrollView …>
<android.support.v7.widget.ButtonBarLayout
…">
…
<Button
android:id="@android:id/button2"
style="?attr/buttonBarNegativeButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@android:id/button1"
style="?attr/buttonBarPositiveButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</android.support.v7.widget.ButtonBarLayout>
</ScrollView>
buttonBarNegativeButtonStyle には buttonBarButtonStyle が指定されており、buttonBarButtonStyle には Widget.AppCompat.Button.ButtonBar.AlertDialog が指定されています。
- <style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">
-
- …
-
- <item name="buttonBarButtonStyle">@style/Widget.AppCompat.Button.ButtonBar.AlertDialog</item>
- <item name="buttonBarPositiveButtonStyle">?attr/buttonBarButtonStyle</item>
- <item name="buttonBarNegativeButtonStyle">?attr/buttonBarButtonStyle</item>
- <item name="buttonBarNeutralButtonStyle">?attr/buttonBarButtonStyle</item>
-
- </style>
<style name="Base.V7.Theme.AppCompat" parent="Platform.AppCompat">
…
<item name="buttonBarButtonStyle">@style/Widget.AppCompat.Button.ButtonBar.AlertDialog</item>
<item name="buttonBarPositiveButtonStyle">?attr/buttonBarButtonStyle</item>
<item name="buttonBarNegativeButtonStyle">?attr/buttonBarButtonStyle</item>
<item name="buttonBarNeutralButtonStyle">?attr/buttonBarButtonStyle</item>
</style>
Widget.AppCompat.Button.ButtonBar.AlertDialog は最終的に Widget.AppCompat.Button.Borderless.Colored を継承しており、これによりボタンの文字が colorAccent 色になっています。
- <style name="Widget.AppCompat.Button.ButtonBar.AlertDialog" parent="Base.Widget.AppCompat.Button.ButtonBar.AlertDialog"/>
-
- <style name="Base.Widget.AppCompat.Button.ButtonBar.AlertDialog" parent="Widget.AppCompat.Button.Borderless.Colored">
- <item name="android:minWidth">64dp</item>
- <item name="android:minHeight">@dimen/abc_alert_dialog_button_bar_height</item>
- </style>
<style name="Widget.AppCompat.Button.ButtonBar.AlertDialog" parent="Base.Widget.AppCompat.Button.ButtonBar.AlertDialog"/>
<style name="Base.Widget.AppCompat.Button.ButtonBar.AlertDialog" parent="Widget.AppCompat.Button.Borderless.Colored">
<item name="android:minWidth">64dp</item>
<item name="android:minHeight">@dimen/abc_alert_dialog_button_bar_height</item>
</style>
Widget.AppCompat.Button.ButtonBar.AlertDialog を継承した style を用意し、文字色を上書きして buttonBarButtonStyle にセットすれば Negative Button の文字色を変えることができます。