44

背景

我试图在当前活动之上放置一个层,它可以解释当前屏幕上发生的事情,类似于在contact+ app上发生的事情。

我知道有一些解决方案(比如showCase 库和 superToolTips 库),而且我也知道我可以创建一个视图并将其添加到活动的窗口中,但我需要放一个整体对话层在上面。

问题

无论我尝试什么,每种解决方案都无法按照我需要的方式工作。

简而言之,我需要的是:

  • 全屏对话框。

  • 操作栏、通知栏和后面的活动内容没有变化(不可见也不合逻辑),这意味着对话框后面的所有内容都保持不变,即在显示对话框之前显示的内容。

  • 是透明的,除了我用于对话框的视图,应该正常显示。

我试过的

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

这是我的代码:

样式.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:

...
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();
}
4

2 回答 2

55

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

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

编辑:

这可以防止暗淡效果:

dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
于 2013-08-20T14:53:01.167 回答
3

只需添加这个,它真的有效!

<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>
于 2015-06-30T03:34:22.543 回答