Как программно изменить цвет фона диалога?
У меня есть основной вид деятельности, когда пользователи могут изменять (с помощью настроек) цвет фона в их любимом цвете. Моя проблема заключается в том, что я не могу изменить цвет фона любых пользовательских диалогов.
Другие ответы в переполнении стека позволяют:
(a) превышение темы по умолчанию до предпочтительного цвета. Я не думаю, что это подходящее решение в этом случае, поскольку я знаю, что изменение тем во время выполнения не рекомендуется.
(b) Изменение в styles.xml (не подходит в этом случае, поскольку я не могу изменить во время выполнения)
(c) Переопределение класса AlertBuilder (но это отображает весь диалог предупреждения)
Это самое близкое, что я пришел к изменению цвета, - это удаление заголовка создателя предупреждений и настройка фона настраиваемого представления на любимый цвет (например, pink). К сожалению, это дает уродливую полосу в верхней и нижней части диалогового окна.
Код включается после изображения, очень приветствуются предложения по изменению фона диалога.
![Dialog appearance]()
Код для внешнего вида
protected Dialog onCreateDialog(int dialogId) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root));
builder.setView(viewMessEdit);
builder.setTitle("Alert builder title");
}
Код для изменения цвета фона настраиваемых диалоговых окон (и заголовок создателя предупреждений удаляется)
protected Dialog onCreateDialog(int dialogId) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root));
builder.setView(viewMessEdit);
viewMessEdit.setBackgroundResource(R.color.pink_dark);
}
Ответы
Ответ 1
У меня возникла такая же проблема. И единственный способ решить эту проблему - расширить мою собственную версию макета. Я вижу, что в вашем случае это AlertDialog. Я рекомендую вам создать уникальный класс, который является вашим настроенным AlertDialog, и создайте макет для этого, а затем вы раздуваете это.
Вот сообщение, которое мне очень помогло. http://blog.androgames.net/10/custom-android-dialog/
Я следил за этим сообщением и решил проблему с настройками диалогов.
Пожалуйста, если у вас есть больше сомнений, сообщите мне.
Спасибо.
Ответ 2
Я нашел решение одного правила!
d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground);
Он работает для меня с нормальным диалогом.
Но я не знаю, работает ли он на AlertDialog
.
Ответ 3
Я нашел хак, не создавая собственный макет, вы можете создавать несколько проектов, играя с некоторыми свойствами AlertDialog
.
Что вам нужно сделать:
Когда на экране отображается AlertDialog
, вызывается OnShowListener
. Итак, добавив dialog.setOnShowListener(this)
, вы сможете настроить AlertDialog
.
Код:
// Create AlertDialog
AlertDialog.Builder adb = new AlertDialog.Builder(context1);
adb.setTitle(context1.getString(R.string.app_name))
.setMessage(message)
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = adb.create();
// Make some UI changes for AlertDialog
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(final DialogInterface dialog) {
// Add or create your own background drawable for AlertDialog window
Window view = ((AlertDialog)dialog).getWindow();
view.setBackgroundDrawableResource(R.drawable.your_drawable);
// Customize POSITIVE, NEGATIVE and NEUTRAL buttons.
Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE);
positiveButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
positiveButton.setTypeface(Typeface.DEFAULT_BOLD);
positiveButton.invalidate();
Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE);
negativeButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
negativeButton.setTypeface(Typeface.DEFAULT_BOLD);
negativeButton.invalidate();
Button neutralButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEUTRAL);
neutralButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
neutralButton.setTypeface(Typeface.DEFAULT_BOLD);
neutralButton.invalidate();
}
});
Ответ 4
Цвет фона диалога
dialog.getWindow().setBackgroundDrawableResource(R.color.glassblack);
действительно отлично работал у меня.
Ответ 5
Предлагаемое решение
d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground);
Не работает (тестируется в версии 6.0), так как он изменяет тень диалога
Вот мое решение:
public static void changeDialogBackground(final Dialog dialog,final int resId) {
dialog.getWindow().getDecorView().setBackgroundResource(resId);
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(final DialogInterface dialog) {
Window window = ((AlertDialog)dialog).getWindow();
window.getDecorView().setBackgroundResource(resId);
}
});
}