Возникла проблема с всплывающим окном - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь установить всплывающее окно, похожее на старый раздел комментариев Facebook.

Диалоговое окно с закругленными углами, но я столкнулся с проблемой с size of dialog box и 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

В одном плюс моя анимация также отключается при изменении .showAtLocation на другие номера

Вывод на Lenovo K8 Примечание:

K8 Note

В примечании K8 Расположение всплывающего окна изменяется, если я изменяю на другое значение.

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Я думаю, что вы хотели бы преобразовать пиксели в dp, а не dp в пиксели, чтобы соответствовать разным разрешениям экранов.Больше информации здесь .

Это как преобразовать пиксели в dp.

0 голосов
/ 06 февраля 2019

Создайте PopupWindow как:

popupWindow= new PopupWindow(
                        customView,
                        LayoutParams.MATCH_PARENT,
                        LayoutParams.MATCH_PARENT
                );

И установите его местоположение как:

popupWindow.showAtLocation(linearLayout1, Gravity.CENTER, 0, 0)

И добавьте верхнее поле customView 10dp или 5dp в xml

0 голосов
/ 06 февраля 2019

Попробуйте следующее решение: на 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

0 голосов
/ 24 января 2019

Похоже, эти 2 телефона имеют разные разрешения экрана.Таким образом, вы должны использовать 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 - позиция всплывающего окна

Дайте мне знать, если вам нужно подробное объяснение.

...