在活动顶部创建一个透明对话框

44

背景

我想在当前活动的顶部放置一个图层,解释当前屏幕上正在进行的事情,类似于 联系人+应用程序 的操作。

我知道有一些解决方案(例如 showCase库 和 superToolTips库 ),我也知道可以创建一个视图并将其添加到活动窗口中以置于顶部,但我需要放置一个整个的对话框图层。

问题

无论我尝试什么,每个解决方案都不能按照我需求的方式工作。

简而言之,我需要:

  • 全屏对话框。

  • 不对动作栏、通知栏和后面的活动内容做出任何更改(即,对话框后面的所有内容保持与对话框出现前一样)。

  • 透明,除了我用于对话框的视图之外,这些视图应正常显示。

我尝试过的方法

可悲的是,我总是只得到我所需要的一部分。

这是我的代码:

styles.xml:

<style name="full_screen_dialog">
        <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:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>

MainActivity.java:

->

MainActivity.java:

...
final Dialog dialog = new Dialog(this, R.style.full_screen_dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.floating_tutorial);
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
dialog.getWindow().setFormat(PixelFormat.TRANSLUCENT);
dialog.show();

这段代码将布局放在活动的顶部,但不幸的是它没有透明度,尽管我已经设置了。我使用的布局非常简单,所以我不会发布它。

问题

我漏掉了什么?应该怎么修复代码?

如何使对话框同时具有透明度、全屏和不改变操作栏和通知栏。


可行解决方案

编辑:在找到好的解决方案后,这里是可行的代码:

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.floating_tutorial);
    final Window window = dialog.getWindow();
    window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.show();
}

我想在屏幕中央显示这个对话框...我该怎么做? - Ravi Yadav
明白了.... window.setLayout(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT); - Ravi Yadav
@user3138859 我不明白。抱歉。 - android developer
@androiddeveloper WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); 使用此代码,对话框将显示在顶部。但是使用wrap content时,它会显示在中心位置。 - Ravi Yadav
@user3138859 好的,我猜你已经知道如何处理它了。 :) - android developer
显示剩余4条评论
2个回答

56

只需更改您的对话框的背景颜色:

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

编辑:

这样做可以避免变暗效果:

dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

简易而简短的解决方案。它起作用了。但是,由于某种原因,在显示对话框时屏幕变暗了。请告诉我如何更改它(自定义和/或禁用它)。 - android developer
糟糕,我刚刚删除了我的评论。如果你也删除你的,那我也会删除我的... :) 无论如何,谢谢你。它完美地运行了。 - android developer
@androiddeveloper np :) 这真的很让人困扰,因为它在框架中隐藏得很好。 - Steve Benett
我写的东西中哪些不再需要了?我认为 full_screen_dialog 不再需要了。还有其他的吗? - android developer
我觉得唯一可疑的代码是dialog.getWindow().setFormat(PixelFormat.TRANSLUCENT); - Steve Benett
显示剩余2条评论

4

只需加上这个,它真的可以工作!

<item name="android:windowIsTranslucent">true</item>
        <item name="android:windowCloseOnTouchOutside">true</item>
        <item name="android:windowBackground">@android:drawable/alert_dark_frame</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>

这是很久以前的事了。我甚至都不记得这个问题了。 - android developer
3
这对其他人可能很有用,你不是唯一想要实现这样一个窗口的人。 - Mike76

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