Как использовать и стилить новый AlertDialog из appCompat 22.1 и выше
Я пытаюсь перенести из default android AlertDialog
в новый, включенный в appCompat-22.1
До сих пор я понимаю, что вам нужно импортировать пакет android.support.v7.app.AlertDialog
для его использования.
Но как я могу его стилизовать? Например, измените цвет кнопки/цвет кнопки, цвет заголовка, цвет сообщения и цвет фона?
Ответы
Ответ 1
При создании AlertDialog
вы можете установить тему для использования.
Пример - создание диалога
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
builder.setTitle("AppCompatDialog");
builder.setMessage("Lorem ipsum dolor...");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();
styles.xml - Пользовательский стиль
<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
<!-- Used for the buttons -->
<item name="colorAccent">#FFC107</item>
<!-- Used for the title and text -->
<item name="android:textColorPrimary">#FFFFFF</item>
<!-- Used for the background -->
<item name="android:background">#4CAF50</item>
</style>
Результат
![styled alertdialog]()
Edit
Чтобы изменить внешний вид заголовка, вы можете сделать следующее. Сначала добавьте новый стиль:
<style name="MyTitleTextStyle">
<item name="android:textColor">#FFEB3B</item>
<item name="android:textAppearance">@style/TextAppearance.AppCompat.Title</item>
</style>
после этого просто укажите этот стиль в MyAlertDialogStyle
:
<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
...
<item name="android:windowTitleStyle">@style/MyTitleTextStyle</item>
</style>
Таким образом вы можете определить другое textColor
для сообщения через android:textColorPrimary
и другое для названия через стиль.
Ответ 2
Чтобы использовать тему для всего приложения и не используйте второй параметр для стиля диалога
<style name="MyTheme" parent="Base.Theme.AppCompat.Light">
<item name="alertDialogTheme">@style/dialog</item>
<item name="colorAccent">@color/accent</item>
</style>
<style name="dialog" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
<item name="colorAccent">@color/accent</item>
</style>
В моем приложении с использованием цветового акцента в теме не отображаются кнопки alertDialog с темой colorAccent. Я должен добавить стиль диалога в тему.
Ответ 3
Если вы хотите использовать новый файл android.support.v7.app.AlertDialog и иметь разные цвета для кнопок, а также иметь собственный макет, посмотрите на https://gist.github.com/JoachimR/6bfbc175d5c8116d411e
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.custom_layout, null);
initDialogUi(v);
final AlertDialog d = new AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle)
.setTitle(getString(R.string.some_dialog_title))
.setCancelable(true)
.setPositiveButton(activity.getString(R.string.some_dialog_title_btn_positive),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
doSomething();
dismiss();
}
})
.setNegativeButton(activity.getString(R.string.some_dialog_title_btn_negative),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
})
.setView(v)
.create();
// change color of positive button
d.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Button b = d.getButton(DialogInterface.BUTTON_POSITIVE);
b.setTextColor(getResources().getColor(R.color.colorPrimary));
}
});
return d;
}
![введите описание изображения здесь]()
Ответ 4
Следуйте за ответом @reVerse, но в моем случае у меня уже было какое-то свойство в AppTheme
как
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:textColor">#111</item>
<item name="android:textSize">13sp</item>
</style>
Итак, мой диалог будет выглядеть так:
![введите описание изображения здесь]()
Я решил его
1) Измените импорт из android.app.AlertDialog
в
android.support.v7.app.AlertDialog
2) Я переопределяю свойство 2 в AppTheme
с нулевым значением
<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
<!-- Used for the buttons -->
<item name="colorAccent">#FFC107</item>
<!-- Used for the title and text -->
<item name="android:textColorPrimary">#FFFFFF</item>
<!-- Used for the background -->
<item name="android:background">#4CAF50</item>
<item name="android:textColor">@null</item>
<item name="android:textSize">@null</item>
</style>
.
AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.MyAlertDialogStyle);
Надеюсь, что это поможет другим людям.
![введите описание изображения здесь]()
Ответ 5
<item name="editTextColor">@color/white</item>
<item name="android:textColor">@color/white</item>
<item name="android:textColorHint">@color/gray</item>
<item name="android:textColorPrimary">@color/gray</item>
<item name="colorControlNormal">@color/gray</item>
<item name="colorControlActivated">@color/white</item>
<item name="colorControlHighlight">#30FFFFFF</item>