Как программно изменить цвет фона диалога? - PullRequest
18 голосов
/ 01 сентября 2011

У меня есть основной вид деятельности, где пользователи могут изменить (через настройки) цвет фона на свой любимый цвет.Моя проблема в том, что я не могу изменить цвет фона любых пользовательских диалогов.

Другие ответы в переполнении стека предполагают:

(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's 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);

}

Ответы [ 5 ]

17 голосов
/ 06 августа 2014

Я нашел решение с одним правилом!

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground);

У меня работает с нормальным диалогом. Но я не знаю, работает ли он на AlertDialog.

8 голосов
/ 01 сентября 2011

Я вроде как столкнулся с той же проблемой. И единственным способом ее решения было расширение моей собственной версии верстки. Я вижу, что в вашем случае это AlertDialog. Что я рекомендую вам сделать, так это создать уникальный класс, то есть настроенный вами AlertDialog, создать макет для этого, а затем надуть его.

Вот пост, который мне очень помог. http://blog.androgames.net/10/custom-android-dialog/

Я последовал этому посту и решил свою проблему с настройкой диалогов.

Пожалуйста, если у вас есть еще сомнения, дайте мне знать.

Спасибо.

4 голосов
/ 26 сентября 2016

Цвет фона диалога

dialog.getWindow().setBackgroundDrawableResource(R.color.glassblack);

действительно работал нормально для меня.

3 голосов
/ 11 февраля 2016

Я нашел хак, без создания пользовательского макета вы можете создавать несколько дизайнов, играя с некоторыми свойствами 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();
    }
});
1 голос
/ 12 августа 2016

Предлагаемое решение

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);
        }
    });
}
...