弹出窗口出现问题

7

我正在尝试设置类似旧版Facebook评论区的弹出窗口。

圆角对话框,但我遇到一个问题,就是对话框的大小showatlocation

当我在不同的移动设备上尝试这段代码时:

        val display = windowManager.defaultDisplay
        val size = Point()
        display.getSize(size)
        val popupWindow = PopupWindow(customView, size.x-30, size.y-300, true)
        popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, -3, 100)
        popupWindow.setAnimationStyle(R.style.PopupAnimation)

XML文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_bg"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10px">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:orientation="horizontal">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/popup_rcv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <EditText
            android:id="@+id/new_comment_et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Please enter Comment" />

        <Button
            android:id="@+id/comment_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Submit" />
    </LinearLayout>
</LinearLayout>

//来自的动画

Oneplus 6T上的输出:One plus

在Oneplus上,当我将.showAtLocation更改为其他数字时,我的动画也会禁用。

Lenovo K8 Note上的输出:

K8 Note

在K8 Note上,如果我更改到另一个值,则弹出窗口的位置也会改变。

提前感谢您。


为什么不直接使用对话框,它可以给你想要的效果,除非你想要动画。这是提示用户反馈的更简单的方法。这样你就不必担心它会出现在哪里,而且你可以向对话框添加自定义样式。https://dev59.com/j2ct5IYBdhLWcg3wF5tF - skryshtafovych
4个回答

5

看起来这两部手机具有不同的屏幕分辨率。因此,你必须使用 DP 而不是像素。请查看此文章

弹出窗口大小。 首先,你必须将对话框大小转换为像素。 这些是随机值,并且它们是硬编码的,但你也可以从资源中获取它们或直接硬编码。

val popUpWidthDp = 200
val popUpHeightDp = 100

val popUpWidthPx = convertDpToPx(popUpWidthDp)
val popUpHeightPx = convertDpToPx(popUpHeightDp)

val popupWindow = PopupWindow(customView, popUpWidthPx, popUpHeightPx, true)

弹出位置。首先,您需要将dp转换为px,然后可以根据屏幕大小计算弹出位置。

val popUpLeftSideMarginDp = 50
val popUpTopMarginDp = 100

val popUpXPoint = convertDpToPx(popUpLeftSideMarginDp)
val popUpYPoint = convertDpToPx(popUpTopMarginDp)

popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, popUpXPoint, popUpYPoint)

请查看这个答案,了解如何将dp转换为像素和反之。

如果弹出窗口的大小和位置与屏幕大小相关,则必须更改以下值:

  • popUpHeightPx,popUpWidthPx - 弹出窗口大小

  • popUpXPoint,popUpYPoint - 弹出窗口位置

如果需要详细说明,请告诉我。


我需要将像素(pixel)更改为 dp,但是我没有在任何地方使用像素,甚至没有在我的 XML 文件中使用。你能否提供更多信息?抱歉,我对安卓设计还很陌生。 - Ashish
弹出窗口中有一个滑块的动画,但在我放置-3和100值后它被移除了。 - Ashish
更新了答案。 - Yamko
它无法工作,显示java.lang.Float无法转换为java.lang.Double。 - Ashish
我以为你在使用 Kotlin。你的异常出现在哪里?你需要显式地将 Float 转换为 Double。 - Yamko

1
创建 PopupWindow 的代码如下所示:
popupWindow= new PopupWindow(
                        customView,
                        LayoutParams.MATCH_PARENT,
                        LayoutParams.MATCH_PARENT
                );

并将其位置设置为:
popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, 0, 0)

在xml中为customView添加10dp或5dp的顶部边距


先生,我在弹出窗口位置和动画方面遇到了问题。如果我将showatlocation更改为0、0,则在OnePlus中它会正常显示,但是当我在K8 Note中使用这些值时,它会出现问题。如果我使用-3、100,则两者都可以完美运行,但是对话框框的动画效果不会显示。 - Ashish
嗨,Ashish,你尝试过将高度和宽度参数设置为“LayoutParams.WRAP_CONTENT”吗? - Zumbarlal Saindane
1
请您添加“customView”的XML代码,这样我可以更好地帮助您。 - Zumbarlal Saindane
当位置设置为0,0时,您能否添加“在Lenovo K8 Note上的输出”的实际图像? - Zumbarlal Saindane
让我们在聊天中继续这个讨论 - Zumbarlal Saindane
显示剩余2条评论

0

我认为您想将像素转换为dp,而不是将dp转换为像素,以适应不同分辨率的屏幕。更多信息在这里

这是如何将像素转换为dp。


0

尝试以下解决方案:它是用Java编写的,但你可以将其转换为Kotlin

PopupWindow popupWin = new PopupWindow(mContext);

// Measure layout here, then we can get measureHeight.
layout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
popupWin .setWidth(layout.getMeasuredWidth()); 
popupWin .setHeight(layout.getMeasuredHeight()); //you can pass height as you want.
popupWin .setContentView(layout);
popupWin .showAsDropDown(anchorView,0 ,0, Gravity.NO_GRAVITY);

这里的anchorView是我们想要在其中作为下拉菜单打开PopupWindow的视图。

PopupWindow


我正在寻找类似于Instagram的评论区,但尺寸较小,但对话框存在问题。那么anchorView能帮助我吗? - Ashish
你可以尝试使用它来设置高度和锚定视图。 - Chetan Joshi
你能帮我解决DialogBox或PopupWindow的问题吗?因为在多个部分出现了问题。 - Ashish
请查看我回答中添加的链接。 - Chetan Joshi
我尝试使用您提供的链接,但是没有解决我的问题,因为它会固定在屏幕底部,退出动画也会消失。 - Ashish

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