更改ProgressDialog的背景

28

我正在尝试修改ProgressDialog的背景。我在网上搜索了各种建议(如如何从对话框中删除边框?),但我无法替换ProgressDialog的实际背景。相反,我得到了对话框后面的另一个背景(黄色):

Styled Dialog

我的样式:

<style name="StyledDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@drawable/panel_background</item>
</style>

启动 ProgressDialog 的代码:

ProgressDialog dialog = new ProgressDialog(this, R.style.StyledDialog);
dialog.setTitle("The title");
dialog.setMessage("The message.");
dialog.show();

这个可绘制对象与 SDK 中包含的 9 Patch 图像相同,我只是更改了颜色。如果您能给我一些提示,我会非常感激。


2
我认为这里的问题是标题、消息和图像都有自己的背景设置,而不是在对话框的背景上透明。你需要做的是迭代对话框视图的所有子项,并将它们的背景设置为透明。 - Aleks G
2个回答

69

在问题下方的Aleks G评论指明了正确的方向。对话框的外观由单独的样式(android:alertDialogStyle)定义。但是,不能将样式直接应用于ProgressDialog。现在,如何获得那个黄色背景?

步骤1:定义一个从Theme.Dialog继承的主题:

<style name="MyTheme" parent="@android:style/Theme.Dialog">
    <item name="android:alertDialogStyle">@style/CustomAlertDialogStyle</item>
    <item name="android:textColorPrimary">#000000</item>
</style>

在那里,您可以定义诸如整个窗口的背景颜色(问题中为黄色)、字体颜色等内容。最重要的是定义android:alertDialogStyle。此样式控制问题中的黑色区域的外观。

步骤2:定义CustomAlertDialogStyle

<style name="CustomAlertDialogStyle">
    <item name="android:bottomBright">@color/yellow</item>
    <item name="android:bottomDark">@color/yellow</item>
    <item name="android:bottomMedium">@color/yellow</item>
    <item name="android:centerBright">@color/yellow</item>
    <item name="android:centerDark">@color/yellow</item>
    <item name="android:centerMedium">@color/yellow</item>
    <item name="android:fullBright">@color/yellow</item>
    <item name="android:fullDark">@color/yellow</item>
    <item name="android:topBright">@color/yellow</item>
    <item name="android:topDark">@color/yellow</item>
</style>

这将把问题区域中的黑色设置为黄色。

第三步:将MyTheme应用于ProgressDialog,而不是CustomAlertDialogStyle

ProgressDialog dialog = new ProgressDialog(this, R.style.MyTheme);

下面是结果:

Styled ProgressDialog

同样的步骤也适用于AlertDialog(它是ProgressDialog的父类)。


你好 Aha 非常好的答案,但是一些边框仍然是黑色的。 - Shoeb Ahmed Siddique
你解决了如何去掉黑边的问题吗?@ShoebAhmedSiddique - lyc001
1
有人在API级别8上测试过吗? 对我来说不起作用 :'( - Couitchy
3
@lyc001,您需要使用以下代码:dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); 或者 <item name="android:windowBackground">@android:color/transparent</item>,以设置对话框的背景为透明。 - Gulfaran

-3
你可以尝试我的gist。它基本上在可绘制对象上设置了一个颜色过滤器。
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.ProgressBar;

public class ColoredProgressBar extends ProgressBar {
   public ColoredProgressBar(Context context) {
      super(context);
      if (!isInEditMode())
         init();
   }

   public ColoredProgressBar(Context context, AttributeSet attrs) {
      super(context, attrs);
      if (!isInEditMode())
         init();
   }

   public ColoredProgressBar(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      if (!isInEditMode())
         init();
   }

   /**
    * Changes color.
    */
   private void init() {
      getIndeterminateDrawable().setColorFilter(Color.BLUE, android.graphics.PorterDuff.Mode.MULTIPLY);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接