android 不可靠的对话片段布局

zaqlnxep  于 2023-01-15  发布在  Android
关注(0)|答案(1)|浏览(149)

我注意到有时候DialogFragment显示得很糟糕,例如,给定以下XML:

<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/spacing_large">

    <ImageView
        android:id="@+id/close"
        android:layout_width="@dimen/icon_size_medium"
        android:layout_height="@dimen/icon_size_medium"
        android:layout_gravity="end"
        android:src="@drawable/ic_close"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        style="@style/Text.Subtitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a test with 'match_parent'"
        android:textAlignment="center"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/close" />

</androidx.constraintlayout.widget.ConstraintLayout>

它显示如下:

另一方面,下面的XML是 * broken *:

<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/spacing_large">

    <ImageView
        android:id="@+id/close"
        android:layout_width="@dimen/icon_size_medium"
        android:layout_height="@dimen/icon_size_medium"
        android:layout_gravity="end"
        android:src="@drawable/ic_close"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        style="@style/Text.Subtitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="This is a test with '0dp'"
        android:textAlignment="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/close" />

</androidx.constraintlayout.widget.ConstraintLayout>

我只做了以下更改:

android:layout_width="match_parent" --> android:layout_width="0dp"
add --> app:layout_constraintEnd_toEndOf="parent"

我在其他布局(LinearLayoutFrameLayout)中也遇到过这种情况。为什么会这样呢?
我看到很多关于设置对话框大小的问题,我相信这是由于这个 * bug *。大多数在onResume中设置了新的布局参数,但感觉很糟糕,我觉得有一个解释。
这里使用了DialogFragment实现:

class SomeFragment : DialogFragment() {

    private lateinit var binding: FragmentSomeBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View {
        binding = FragmentSomeBinding.inflate(inflater, container, false)
        return binding.root
    }
}
    • 编辑:**

这是对LinearLayout的一次尝试,具有类似的意外行为。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/spacing_large">

    <ImageView
        android:layout_width="@dimen/icon_size_medium"
        android:layout_height="@dimen/icon_size_medium"
        android:layout_gravity="end"
        android:src="@drawable/ic_close"/>

    <TextView
        style="@style/Text.Subtitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a test with 'LinearLayout'"
        android:textAlignment="center"/>

</LinearLayout>

vngu2lb8

vngu2lb81#

以下XML已损坏
都坏了。
你的ConstraintLayoutandroid:layout_width="match_parent",你不能控制父节点。根据截图,父节点的宽度大概是wrap_content,但是你不应该依赖它,因为它可能会变化。要么给ConstraintLayout一个特定的宽度,要么使用wrap_content作为它的宽度。

相关问题