【问题标题】:Android Studio: Cannot get DialogFragment's inflated layout to match_parentAndroid Studio:无法将 DialogFragment 的膨胀布局获取到 match_parent
【发布时间】:2019-07-02 05:32:34
【问题描述】:

我有一个片段,上面显示了一个 [弹出] DialogFragment。问题是我无法获得我正在膨胀以填充 DialogFragment 的 RelativeLayout。实际上,它总是水平填充它; 从不垂直。

[popup] DialogFragment (RelativeLayout) 将 layout_widthlayout_height 设置为 "match_parent"

以下屏幕截图显示了单独的示例。在每种情况下,白色矩形都是(正确大小的)DialogFragment。膨胀的 XML 是红色和黄色部分(带有 TextView)。这红色和黄色来自背景可绘制对象。

请注意,膨胀的 RelativeLayout总是 占据整个宽度,而 从不 占据整个高度。请注意,我移动了嵌入的 TextView(用于最后两个屏幕截图)以说明两点:

(1) TextView 的位置决定了膨胀布局的高度。

(2) 它的位置对宽度没有影响。

另请注意:

  • TextView 的layout_alignParentStartlayout_alignParentTop 都是true

  • 如果我完全删除 TextView,膨胀的布局“消失”(大概是因为我现在的“高度”为零)。

屏幕截图 #2 和 #5(第二列)是相同的 - 除了 TextView 的位置。

#3 和#6(第三列)也是如此。

(TextView 在屏幕截图 #6 中的红色区域大部分是垂直的。在这里很难看到,但这就是它所在的位置 - 黄色的右侧,其底部与黄色区域的底部对齐.)

我错过了什么/做错了什么?

代码块:

ZzzDialog.kt([弹出] DialogFragment 的来源):

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
    }
}

[TEMP] ClickListener(调用“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
        }

[弹出] DialogFragment 的 XML:

<?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>

上述background的XML

    <?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>    

【问题讨论】:

    标签: android-studio android-dialogfragment dialogfragment


    【解决方案1】:

    试试这个。

    像这样以编程方式获取对话框片段的高度:

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

    然后,获取该父级 RelativeLayout 的引用并以编程方式设置它的高度。

    relativeLayout.getLayoutParams().height = height;
    

    【讨论】:

    • 我刚刚在ZzzDialog.onResume 的最后一行添加了popup.layoutParams.height = popupHgt。弹出窗口(RelativeLayout) 更大。 太大了。 我猜它与背景可绘制对象中的描边和/或填充有关。我确信我可以找到一些解决方法如果我必须。然而,这是我第一次处理“弹出窗口”并且真的想知道如何将(任何)布局膨胀到弹出窗口中。随着我将越来越多的这些“对话框”添加到我的应用程序中,这对我很有帮助。
    • 我也尝试过(再次,最后在 onResume 中):val decorHgt = dialog!!.window!!.decorView.height popup.layoutParams.height = decorHgt 我只有一个白框(没有看到任何可绘制的,也不是它的 TextView)
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多