【问题标题】:Show a PopupWindow centralized显示一个 PopupWindow 集中
【发布时间】:2011-08-29 03:38:30
【问题描述】:

我的应用上有一些弹出窗口,它是全屏的,代码如下:

    content.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));
    content.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    int screenWidth = windowManager.getDefaultDisplay().getWidth();
    int screenHeight = windowManager.getDefaultDisplay().getHeight();
    int x = screenWidth / 2 - content.getMeasuredWidth() / 2;
    int y = screenHeight / 2 - content.getMeasuredHeight() / 2;
    window.showAtLocation(content, Gravity.NO_GRAVITY, x, y);

使窗口居中显示。

但我有另一个不是全屏的 Activity,当弹出窗口打开时,它从需要的位置右下。

试图弄清楚为什么会发生这种情况,我认为 showAtLocation 显示它与当前 Activity 相关,但我需要相对于显示器显示它。

我该怎么做?还是有更简单的方法让弹出窗口居中?

【问题讨论】:

    标签: android android-layout popup


    【解决方案1】:
    popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);
    

    这将使您的视图居中。

    我花了 2 个小时的痛苦才弄清楚这一点。我不需要任何黑魔法数学来处理这个。

    视图只需要窗口令牌,对位置没有其他影响。

    重力告诉布局管理器从哪里开始坐标系以及如何处理这些坐标。我找不到文档,但黑客向我展示了这一点:

    • CENTER 使用弹出窗口的中间来对齐指定的 x,y。所以 0,0 是屏幕居中的
    • BOTTOM 使用弹出窗口的底部与指定的 x,y 对齐。所以 0,0 使弹出窗口底部与屏幕底部对齐。如果您想要 10 像素的内边距,则 y=10(不是 -10)将弹出窗口向上移动 10 像素。

    我在这里写了这个Android PopupWindow.showAtLocation() and effects of Gravity

    【讨论】:

    • 所以,如果我想适应底部,我只是使用这条线mPw.showAtLocation(v, Gravity.BOTTOM, 0, 0); 在 xxhpi 设备上可以吗,比如 Nexus 5?我有问题...
    • 您可以通过日期看出这是在 xxhpi 设备之前发布的。您的代码应该符合您的预期。按照撰写链接查看我发布的不同选项的图片示例。
    • 在 Xamarin Android 中:popupWindow.ShowAtLocation(anyViewOnlyNeededForWindowToken, GravityFlags.Center, 0, 0);
    【解决方案2】:
            View popupView = layoutInflater.inflate(R.layout.index_popviewxml,
                    null);
    
    
            final PopupWindow popupWindow = new PopupWindow(popupView,
                    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, true);
    
    
    
            popupWindow.setTouchable(true);
            popupWindow.setFocusable(true);
    
            popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
    

    【讨论】:

    • 此调用需要 API 级别 19。无论如何我可以在 19 下执行此 API 级别吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多