Нахождение высоты пользовательского диалогового окна - PullRequest
0 голосов
/ 11 января 2019

У меня есть настраиваемое диалоговое окно (cameraTipDialog ctd), которое мне нужно расположить в определенной (x, y) позиции. Эта позиция основана на расположении кнопки на экране. Мне нужно поставить диалоговое окно в положение:

(int) ((ImageButton) findViewById(R.id.infoButton)).getY() - HEIGHT OF MY DIALOG BOX;' 

Но я не могу понять, как получить высоту моего настраиваемого диалогового окна. Его высота равна «обернуть содержимое», поэтому, когда я получаю getLayoutParams.getHeight (), я получаю -1.

Следуя другим идеям о StackOverflow, я попытался использовать (ctd.findViewById(R.id.dialog_root_layout)).getHeight(), но приложение вылетает, говоря, что оно не может найти элемент с идентификатором dialog_root_layout.

Показать код макета:

    cameraTipDialog ctd = new cameraTipDialog(submitHome.this);
    Window window = ctd.getWindow();
    (ctd.findViewById(R.id.dialog_root_layout)).getHeight()
    WindowManager.LayoutParams wlp = window.getAttributes();
    wlp.gravity = Gravity.TOP | Gravity.LEFT;
    wlp.x = (int) ((ImageButton) findViewById(R.id.infoButton)).getX();
    wlp.y = (int) ((ImageButton) findViewById(R.id.infoButton)).getY() - DIALOG HEIGHT;
    window.setAttributes(wlp);
    ctd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    ctd.show();

Диалоговое окно XML code:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/dialog_root_layout"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_marginLeft="16sp"
android:layout_marginRight="16dp"
android:background="@drawable/popup_background">

<TextView
    android:id="@+id/content"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="32dp"
    android:text="@string/tipsForSuccess"
    android:textColor="@android:color/white"
    android:textSize="10sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/header" />

<TextView
    android:id="@+id/header"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:text="text here."
    android:textColor="@android:color/white"
    android:textSize="10sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

1 Ответ

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

Чтобы узнать фактическую высоту, вы можете использовать getRootView().getMeasuredHeight() на вашем dialog_root_layout. Но вы можете сделать это только после того, как изображение будет измерено, поэтому вам нужно выполнить вычисления в OnShowListener. Модифицированный код выглядит так:

cameraTipDialog ctd = new cameraTipDialog(this);

ctd.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        Dialog ctd = (Dialog) dialog;

        View dialogRootLayout = ctd.findViewById(R.id.dialog_root_layout);
        int dialogHeight = dialogRootLayout.getRootView().getMeasuredHeight();

        Window window = ctd.getWindow();
        WindowManager.LayoutParams wlp = window.getAttributes();
        wlp.gravity = Gravity.TOP | Gravity.LEFT;
        wlp.x = (int) ((ImageButton) findViewById(R.id.infoButton)).getX();
        wlp.y = (int) ((ImageButton) findViewById(R.id.infoButton)).getY() - dialogHeight;
        window.setAttributes(wlp);
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }
});

ctd.show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...