弹出窗口类似于any.do。

5
我正在编写一款应用程序,可以在弹出窗口中显示未接来电和未读短信。它还具有提醒功能(关闭弹出窗口并在指定时间后重新打开)。与any.do的弹出窗口类似。
我使用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% 的窗口,同时仍然能够滚动下面的窗口(并且也可以在其上执行单击事件)。

所以我的问题是:

  1. 使用WindowManager创建这个弹出窗口是否正确?
  2. 如果是,为什么它有时会不想要地消失?如何防止它?
  3. 如果不是,如何创建一个行为与使用WindowManager创建的窗口相同的活动?
  4. 还是两种方法都不正确?在这种情况下;什么才是正确的方法?

你完成了吗?我需要一些关于这个的想法。我的做法是创建了一个相对布局的活动,并在底部放置了一些组件,将主题设置为透明,并将活动动画设置为从底部进入和从底部退出。但是背景活动会在我的活动运行时卡住。 - prashantwosti
1个回答

0
这是我用来做同样事情的代码。
public class PopupActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AlertDialog.Builder adb = new Builder(this);
        AlertDialog dialogTest = adb.setTitle("Test title")
                .setMessage("Test message")
                .setNeutralButton("Button", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // do something
                        PopupActivity.this.finish();
                    }
                }).create();
        adb.setCancelable(false);
        dialogTest.show();
    }
}

还有XML样式(最初发布在这里https://dev59.com/P3I95IYBdhLWcg3wvgl9#2700683

<style name="Theme.Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</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>
</style>

在清单文件中设置活动的样式。然后,只需在任何时间启动活动,即可显示弹出窗口。您可以向意图添加额外数据,并将其用于自定义弹出窗口。


我不确定我是否理解了。你的意思是你写的活动应该像我想要的弹出窗口一样行事,还是在创建活动后启动的警报窗口?在你发送的链接中没有关于警报窗口的内容。 - richard
只是为了确保我清楚我的问题。我想看到弹出窗口在底部,覆盖窗口的30%,但同时能够滚动其下面的窗口(并且也能够执行点击事件)。 - richard
@Richard,很抱歉我误解了你的意思。针对您的需求,我建议使用RelativeLayout布局,其中包含两个元素——主视图和弹出窗口(可以是一个片段),将第二个元素附加到底部,并在需要时更改其可见性。这样用户就可以看到弹出窗口和主视图,并能够与它们进行交互。 - Maxim Efimov
谢谢,但这只适用于我的应用程序,而不适用于其他应用程序。我需要一个弹出窗口,就像应用程序“any.do”使用的那样,在特定事件发生时弹出,即使本机应用程序已关闭。在这种情况下,弹出窗口应该覆盖任何其他应用程序的部分,而不会阻止它。所有这些都已经通过我的WindowManager解决方案实现了,唯一的问题是它有时会无缘无故地消失。 - richard

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