【问题标题】:Having issue with Popup window弹出窗口有问题
【发布时间】:2019-01-24 10:08:06
【问题描述】:

我正在尝试设置类似于旧 Facebook 评论部分的弹出窗口。

圆角对话框,但我遇到了对话框的size of dialog boxshowatlocation 的问题。

当我在不同的手机上尝试这段代码时:

        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>

//来自Source的动画

一加 6T 上的输出:

另外,当我将 .showAtLocation 更改为其他数字时,我的动画也会禁用

Lenovo K8 Note 上的输出:

在 K8 中,如果我更改为另一个值,则弹出窗口的位置会发生变化。

在此先感谢您。

【问题讨论】:

  • 为什么不直接使用对话框来代替它会产生你想要的效果,除非你想要动画。这是提示用户反馈的更简单的方法。这样您就不必担心它会显示在哪里,而且您可以将自定义样式添加到对话框stackoverflow.com/questions/12351330/…

标签: android kotlin popupwindow


【解决方案1】:

这两款手机的屏幕分辨率似乎不同。所以你必须使用 DP 而不是像素。检查这个post

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

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)

查看此answer 以了解如何将 dp 转换为像素,反之亦然。

如果弹出窗口的大小和位置与屏幕大小相关,那么您必须更改这些值:

  • popUpHeightPx, popUpWidthPx - 弹出窗口大小

  • popUpXPoint, popUpYPoint - 弹出位置

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

【讨论】:

  • 我需要将像素更改为 dp 意味着我没有在任何地方使用像素,甚至在我的 xml 文件中也没有,所以您可以提供更多信息。对不起,我是 android 设计的新手
  • 弹出窗口中有滑块动画,但在我输入这些值 -3 和 100 后它被删除了
  • 更新了答案
  • 它不工作它说 java.lang.Float 不能转换为 java.lang.Double
  • 我以为你在使用 Kotlin。你到底在哪里有例外?您需要将 Float 显式转换为 Double。
【解决方案2】:

创建弹出窗口为:

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,您是否尝试将高度和宽度参数设置为“LayoutParams.WRAP_CONTENT”
  • 它是否显示与 oneplus 图像相同的高度,因为我需要那个大小的对话框
  • 能否请您添加您的“customView”的xml代码,以便我可以帮助您更多
  • 位置设置为 0,0 时能否添加“联想 K8 Note 输出”的实际图像
【解决方案3】:

尝试以下解决方案:它在 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 对我有帮助吗?
  • 你可以尝试用它来给出高度和anchorView。
  • 你能帮我解决对话框或弹出窗口问题吗
  • 请在我的答案中添加链接。
  • 我尝试使用您的链接,但我的问题没有解决方案,因为它粘在屏幕底部并且退出动画也消失了
【解决方案4】:

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

这是how,用于将像素转换为 dp。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多