【问题标题】:popup window like any.do像 any.do 一样的弹出窗口
【发布时间】:2013-10-02 20:37:06
【问题描述】:

我正在编写一个在弹出窗口中显示未接来电和未读短信的应用程序。它还具有提醒功能(关闭弹出窗口并在指定时间后打开它)。它类似于 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. 还是两种方式都错了?在这种情况下;正确的方法是什么?

【问题讨论】:

  • 你完成了吗?我需要一些想法。我所做的是创建一个具有相对布局的活动并在底部放置一些组件,将主题设置为透明并将活动动画设置为从底部进入并从底部退出。但后台活动卡住了,直到我的活动正在运行。

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


【解决方案1】:

这是我用来做同样事情的代码

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>

在清单文件中设置 Activity 的样式。然后在您想要显示弹出窗口的任何时候启动活动。您可以将 EXTRA 数据添加到意图并使用它来自定义弹出窗口。

【讨论】:

  • 我不确定我是否理解。你的意思是你写的活动应该表现得像我想要的弹出窗口,或者在创建活动后启动的警报窗口?在您发送的链接中,没有任何关于警报窗口的内容。
  • 只是为了确保我把我的问题说清楚了。我想在底部看到弹出窗口,覆盖窗口的 30%,但能够同时滚动它下面的窗口(并在其上执行点击事件)。
  • @Richard 很遗憾,我误会了你。出于您的目的,我建议RelativeLayout 包含两个元素 - 主视图和弹出窗口(可能是一个片段),将第二个元素附加到底部并随时更改它的可见性。因此,用户将看到弹出窗口、主视图并能够与它们进行交互。
  • 谢谢,但这仅适用于我的应用程序,但不适用于其他应用程序。我需要一个像应用程序“any.do”使用的弹出窗口,当发生特殊事件时会弹出,即使本机应用程序关闭也是如此。在这种情况下,弹出窗口应该覆盖任何其他应用程序的部分而不阻塞它。这一切都已经适用于我的 WindowManager 解决方案,唯一的问题是它有时会在没有明确原因的情况下消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2011-03-26
  • 1970-01-01
  • 2014-03-27
  • 2021-03-07
  • 1970-01-01
相关资源
最近更新 更多