我正在编写一款应用程序,可以在弹出窗口中显示未接来电和未读短信。它还具有提醒功能(关闭弹出窗口并在指定时间后重新打开)。与any.do的弹出窗口类似。
我使用WindowManager创建了这样的窗口,但由于某些原因,弹出窗口会在一段时间后消失(尽管应该一直打开,直到用户关闭它或点击提醒按钮,可能需要几个小时)。
这是我创建现有弹出窗口的方式。
我使用WindowManager创建了这样的窗口,但由于某些原因,弹出窗口会在一段时间后消失(尽管应该一直打开,直到用户关闭它或点击提醒按钮,可能需要几个小时)。
这是我创建现有弹出窗口的方式。
windowManager = (WindowManager) context.getApplicationContext()
.getSystemService(Context.WINDOW_SERVICE);
this.inflater = LayoutInflater.from(context);
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.BOTTOM;
vgPopupWindow = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.popup_mainwindow, null);
vgPopupContent = (ViewFlipper) vgPopupWindow.findViewById(R.id.popup_content);
vgPopupAreaContent = (ViewGroup) vgPopupWindow.findViewById(R.id.popup_area_content);
vgPopupAreaActions = (ViewGroup) vgPopupWindow.findViewById(R.id.popup_area_actions);
vgPopupTabs = (LinearLayout) vgPopupWindow.findViewById(R.id.popup_tabs);
vgPopupHeader = (LinearLayout) vgPopupWindow.findViewById(R.id.popup_main_header);
windowManager.addView(vgPopupWindow, params);
因为我不确定WindowManager是否真的是正确的方法,所以我也尝试使用以下样式的活动来实现相同的功能。
<style name="PopupWindow" parent="CustomTheme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowIsTranslucent">true</item>
现在它看起来就像窗口管理器版本,但是有一个问题:我不能访问它下面应用程序的窗口,因为窗口的半透明部分看起来很完美,但会阻挡任何点击事件传递到下面的窗口,以至于我无法滚动或进行任何操作。就像在 any.do 中一样,我只想让弹出窗口显示出来,但不要阻止在打开弹出窗口时对下面的窗口进行任何操作。
编辑:我希望看到弹出窗口在底部,覆盖30% 的窗口,同时仍然能够滚动下面的窗口(并且也可以在其上执行单击事件)。
所以我的问题是:
- 使用WindowManager创建这个弹出窗口是否正确?
- 如果是,为什么它有时会不想要地消失?如何防止它?
- 如果不是,如何创建一个行为与使用WindowManager创建的窗口相同的活动?
- 还是两种方法都不正确?在这种情况下;什么才是正确的方法?