Android Studio: Невозможно получить раздутый макет DialogFragment в match_parent - PullRequest
1 голос
/ 02 июля 2019

У меня есть фрагмент, поверх которого я показываю [popup] DialogFragment.Проблема в том, что я не могу получить RelativeLayout, который я надуваю, чтобы заполнить DialogFragment.На самом деле, это всегда , заполняющее его горизонтально; никогда по вертикали.

[Popup] DialogFragment (RelativeLayout) имеет layout_width и layout_height, установленный на "match_parent".

На следующих снимках экрана показаны отдельные примеры.В каждом случае белый прямоугольник - это (правильный размер) DialogFragment.Надутый XML - это красная и желтая часть (с TextView).Этот красный и желтый цвета происходят из фона, который можно нарисовать.

enter image description here enter image description here

Обратите внимание, что завышенный RelativeLayout всегда занимает всю ширину и никогда всю высоту.Обратите внимание, что я переместил встроенный TextView (для последних двух снимков экрана), чтобы проиллюстрировать две точки:

(1) Это позиция этого TextView, которая определяет высоту надутого макета.

(2) Его положение не влияет на ширину.

Также обратите внимание:

  • TextView's layout_alignParentStart и layout_alignParentTop оба true

  • Если я полностью удаляю TextView, раздутый макет «исчезает» (предположительно, потому что теперь у меня «высота» равна нулю).

Скриншоты # 2и # 5 (второй столбец) одинаковы - за исключением положения TextView.

То же самое относится к # 3 и # 6 (третий столбец).

(TextView по большей части вертикальный в красной области на снимке экрана № 6. Здесь очень трудно увидеть, но это то, где он находится - справа от желтого, его нижний край выровнен понижняя часть желтой области.)

Итак: мой вопрос - конечно - что я пропускаю / делаю неправильно?

Кодчанки:

ZzzDialog.kt (источник DialogFragment [popup]):

package com.zazzem.two.dialogs

import android.app.Dialog
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment

class ZzzDialog : DialogFragment() {
    private lateinit var popup: View

    private var popupLft: Int = 0
    private var popupTop: Int = 0
    private var popupWid: Int = 0
    private var popupHgt: Int = 0

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val inflater = LayoutInflater.from(context)
        popup = inflater.inflate(com.zazzem.two.R.layout.dialog_zzz, null)

        return activity!!.let {
            val builder = AlertDialog.Builder(it)
            builder.setView(popup)
            builder.create()
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val win = dialog!!.window!!
        win.setGravity(Gravity.TOP or Gravity.LEFT) //top left first, so x & y below will be relative to there
        return super.onCreateView(inflater, container, savedInstanceState)
    }

    override fun onResume() {
        super.onResume()

        val win = dialog!!.window ?: return
        val params = win.attributes
        params.x = popupLft
        params.y = popupTop
        params.width = popupWid
        params.height = popupHgt
        win.attributes = params
    }

    fun setPosAndSize(lft: Int, top: Int, wid: Int, hgt: Int) {
        popupLft = lft
        popupTop = top
        popupWid = wid
        popupHgt = hgt
    }
}

ClickListener [TEMP] (гдевызовите «setup» и покажите, что [popup] сделано из):

        btnDevTemp.setOnClickListener {
            fun doOne(l: Int, t: Int, w: Int, h: Int) {
                dialog_specs.text = "Lft:$l Top:$t Wid:$w Hgt:$h"
                val dlg = ZzzDialog()
                dlg.setPosAndSize(l, t, w, h)
                dlg.show(activity!!.supportFragmentManager, "ZzzDialog")
            }
            doOne(100,200,800,800) //pic #1
            //doOne(10,10,1200,1900) //pic #2 and #5
            //doOne(500,500,800,1200) //pic #3 and #6
            //doOne(300,300,450, 900) //pic #4
        }

XML для [popup] DialogFragment:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bkgr_zzz"
    android:orientation="horizontal"
    >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="151dp"
        android:layout_marginTop="112dp"
        android:backgroundTint="@color/Pink"
        android:text="TextView"
        />
</RelativeLayout>

XML для вышеупомянутых background:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle"
        >
        <!-- yellow -->
        <solid android:color="#FFFF00" />
        <padding
            android:bottom="20dp"
            android:left="20dp"
            android:right="20dp"
            android:top="20dp"
            />
        <!-- red -->
        <stroke
            android:width="25dp"
            android:color="#FF0000"
            />
    </shape>    

Спасибо!

1 Ответ

0 голосов
/ 02 июля 2019

Попробуйте это.

Получите высоту фрагмента диалога программно следующим образом:

int height  = getDialog().getWindow().getDecorView().getHeight();

Затем получите ссылку на этот родительский RelativeLayout и установите его высоту также программно.

relativeLayout.getLayoutParams().height = height;
...