Подтвердить что ты не робот

Как программно изменить цвет фона диалога?

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

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

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

}
4b9b3361

Ответ 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);
        }
    });
}