使警告对话框背景透明化

3
我正在Android Jelly Beans OS上创建一个警告对话框。一切都很好,但我想要的是,警告对话框的背景不是黑色而是透明的。我阅读了许多文章和stackoverflow上用户的问题,但没有一个能帮助我解决问题。
这是我的代码:
AlertDialog.Builder builder =  new AlertDialog.Builder(this, R.style.CustomAlertDialog);
    builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog1, int which) {
            gActivityResult = REQUEST_PICK_CONTACT;
            onResume();
            return;
        } }); 
    builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog1, int which) {
            return;
        } }); 
    View view = getLayoutInflater().inflate(R.layout.alert_dialog, null);
    builder.setTitle(R.string.gender_age);
    builder.setInverseBackgroundForced(false);
    builder.setView (view);


    dialog = builder.create ();

这是我在 res/values/styles.xml 中定义的 CustomAlertDialog。

<style name="CustomAlertDialog" parent="@android:style/Theme.Dialog">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item> 
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowBackground">@color/transparent_color</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:gravity">left</item>
</style>

这里是color.xml文件。
<resources>
   <color name="transparent_color">#00000000</color>
</resources>

但它并没有帮助我。

我的问题是:这可行吗?如果可以,你能指导我正确的方向吗?


你的目标仅仅是想让它透明吗?还是你选择构建自定义主题有其他原因?即使没有自定义主题,也可以实现透明效果。 - Shobhit Puri
我只需要它是透明的。 - Raj
4个回答

7
我发现了一种与AlertDialog.Builder兼容的方法。在Eclipse的Android“设备”选项卡中使用“转储视图层次结构”按钮,我看到了许多嵌套的FrameLayouts,并且似乎背景在这些里面,而不是窗口中。
遍历这些视图并在每个视图上将背景设置为透明实际上起作用了(我的自定义视图然后浮动在变暗的应用程序上,没有框架或背景,并且布局没有改变)。我有一个自定义视图,所以从它下面遍历,但是从窗口向上遍历ViewGroups也应该可以工作。
我在自己的DialogFragment子类中使用AlertDialog.Builder和自定义视图。
   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    configureDialogBuilder(builder);

    final LayoutInflater inflater = getActivity().getLayoutInflater();
    customView = inflater.inflate(customViewId, null);
    builder.setView(customView);

    final AlertDialog dialog = builder.create();
    return dialog;
  }

  @Override
  public void onStart() {
    super.onStart();
    clearBackgrounds(customView);
  }

  private void clearBackgrounds(View view) {
    while (view != null) {
      view.setBackgroundResource(android.graphics.Color.TRANSPARENT);

      final ViewParent parent = view.getParent();
      if (parent instanceof View) {
        view = (View) parent;
      } else {
        view = null;
      }
    }
  }

这个可以运行,但是警告对话框的按钮区域没有背景。你怎么处理它? - android developer

3

简单地调用,

customDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

就在之前

customDialog.show();

3

我曾经为我的一个项目做过类似的事情。我所做的是创建一个专门用于 AlertDialog 的 Activity。

不确定这是否符合您的要求,但在这里发布以帮助您...

活动

public class ShowAlertDialogActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.alert_dialog);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // create the builder

        AlertDialog alert = builder.create();
        alert.show();
    }
}

我将在布局文件(alert_dialog.xml)中将背景设置为透明...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:background="@android:color/transparent">
</LinearLayout>

然后将该活动添加到清单文件中...

<activity
    android:name=".ShowAlertDialogActivity"
    android:label="@string/app_title"
    android:theme="@style/AppTheme"
    android:launchMode="singleTask" />

这个对我来说解决了问题。

希望这能有所帮助。


这是我读过的最令人失去动力的答案!一项对话活动;创造力达到巅峰。变通方法有限,不可越界! - sud007
1
@sud007,文档中有类似这样的内容:https://developer.android.com/guide/topics/ui/dialogs#ActivityAsDialog。 - Ahmed na
@Ahmedna,该文档中明确提到了用例。但是,在您严格想要掌握特定“Activity”上下文的情况下,这可能会使情况变得复杂。而且,准确地说,我指的是权宜之计并不是解决方案!但是作为开发人员,我们必须时不时地修补一些东西。感谢你指出这个问题,伙计! :) - sud007

3

谢谢Shobhit!将Alert Dialog转换为Dialog确实帮助我使背景透明。但是,这意味着我需要添加自己的“确定”和“取消”按钮,并为它们添加监听器?此外,现在我无法看到对话框的边框了! - Raj
在您的AlertDialog上(而不是构建器上)尝试:dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)) - Shobhit Puri
我之前尝试过,但没有成功。我还尝试了dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0)),但也没有成功。我不确定为什么给警告对话框设置透明背景会成为一个大问题。 - Raj
你说得对。也许这就是他们创建对话框的原因。如果我需要像你所希望的那样的东西,通常我会使用 Dialogs 或者 "一个带有对话框主题的活动"。 - Shobhit Puri

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