如何以编程方式更改对话框背景颜色?

时间:2011-09-01 11:35:38

标签: android dialog background-color

我有一个主要活动,用户可以将背景颜色(通过偏好)更改为他们喜欢的颜色。我的问题是我无法更改任何自定义对话框的背景颜色。

堆栈溢出的其他答案建议:

(a)overiding the default theme为首选颜色。在这种情况下,我不认为这是一个合适的解决方案,因为我知道不建议在运行时更改主题。

(b)Changing in styles.xml(在这种情况下不合适,因为我无法在运行时更改)

(c)Overriding the AlertBuilder class(但这会暗示整个警报对话框)

我最近改变颜色的方法是删除警报构建器标题,并将自定义视图的背景设置为喜欢的颜色(例如,粉红色)。不幸的是,这会在对话框的顶部和底部产生一个丑陋的条带。

代码包含在图像之后,非常感谢有关如何更改对话框背景的建议。

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 个答案:

答案 0 :(得分:17)

我找到了一个规则解决方案!

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

它适用于我的正常对话框。 但我不知道它是否适用于AlertDialog

答案 1 :(得分:8)

我有点面临同样的问题。解决它的唯一方法是扩展我自己的布局版本。我看到你的情况是一个AlertDialog。我建议你做的是创建一个独特的类,即你自定义的AlertDialog并为此创建一个布局,然后你膨胀它。

这是一篇对我很有帮助的帖子。 http://blog.androgames.net/10/custom-android-dialog/

我按照这篇文章解决了自定义对话框的问题。

如果您有更多疑问,请告诉我。

感谢。

答案 2 :(得分:4)

对话背景色

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

对我来说真的很好。

答案 3 :(得分: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 :(得分:1)

建议的解决方案

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