像any.do一样的弹出窗口

时间:2013-10-02 20:37:06

标签: android android-layout android-intent android-windowmanager

我正在编写一个应用程序,在弹出窗口中显示未接来电和未读短信。它还有一个提醒功能(关闭弹出窗口并在指定时间后打开它)。它类似于any.do的弹出窗口。

我能够通过使用WindowManger创建这样一个窗口,但由于某些我目前尚不理解的原因,弹出窗口在一段时间后消失(尽管它应该被打开,直到用户关闭它,或点击提醒按钮可能需要数小时。)

这是我创建现有弹出窗口的方式

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>

它的外观现在就像WindowManager版本一样,但有一个问题:我无法访问其下方应用程序的窗口,因为窗口的半透明部分看起来很完美,但阻止任何点击事件到下面的窗口,所以我不能滚动它或做任何事情。就像在any.do中我只想要显示那个窗口,但是当弹出窗口打开时,不要阻止在窗口下面工作的任何可能性。

编辑:我想在底部看到弹出窗口,覆盖窗口的30%,但能够同时滚动窗口下方的窗口(并在其上执行点击事件)。

所以我的问题是:

  1. 是WindowManager创建此弹出窗口的正确方法吗?
  2. 如果是,为什么它有时会消失?我怎么能阻止它?
  3. 如果不是,我如何创建一个与我使用WindowManager创建的窗口一样的活动?
  4. 或两者都错了?在这种情况下;什么是正确的方式?

1 个答案:

答案 0 :(得分: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://stackoverflow.com/a/2700683/995020

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

在清单文件中设置活动的样式。然后只要您想要显示弹出窗口,就可以开始活动。您可以将EXTRA数据添加到intent中,并使用它来自定义弹出窗口。