在活动之上创build一个透明的对话框

背景

我正在尝试在当前活动的顶部放置一个图层,以解释当前屏幕上发生的情况,类似于contact + app上发生的情况。

我知道有一些解决scheme(如showCase库和superToolTips库),我也知道,我可以创build一个视图,并将其添加到活动窗口顶部,但我需要把整个对话层在上面。

问题

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

总之,我需要的是:

  • 全屏幕对话框。

  • 对操作栏,通知栏和后面活动的内容没有任何改变(不可视和不合逻辑),这意味着对话框后面的所有内容都保持不变,在对话框显示前一刻显示。

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

我试过了

可悲的是,我一直只得到我需要的东西的一部分。

这是我的代码:

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:

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

这段代码将把布局放在活动的顶部,但是可惜的是它没有任何透明度,尽pipe我已经设置了它。 我使用的布局非常简单,这就是为什么我不发布它。

我错过了什么? 应该做些什么来修复代码?

我怎样才能使对话框透明,全屏幕,并不会更改操作栏和通知栏。


工作解决scheme

编辑:find一个好的解决scheme后,这里的工作代码:

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

只要改变你的Dialog的背景颜色即可:

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

编辑:

这可以防止暗淡的效果:

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

只要添加这个,它真的有用!

 <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>