使用ConstraintLayout作为DialogFragment的根布局时的奇怪行为

时间:2018-04-13 20:13:06

标签: android android-dialogfragment android-dialog android-constraintlayout

我正在使用DialogFragment构建自定义对话框。我注意到非常奇怪的行为,各种ViewGroup用作对话框布局的根。我认为这是由于系统窗口之间的一些奇怪的交互以及它如何显示对话框。在这个特定的例子中,我使用ConstraintLayout作为布局的根视图。

显示时,对话框延伸到屏幕边缘,布局检查器显示测量宽度超过16,000,000。甚至更奇怪的是ConstraintLayout定义填充,仍然可以在屏幕上看到。

以下是对话框的课程:

public class AgreementDialog extends DialogFragment {

    // Bindings..

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.dialog_agreement, container);
        ButterKnife.bind(this, view);

        return view;
    }
}

以下是布局dialog_agreement

<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:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#fff"
    android:padding="@dimen/margin_large"
    android:layout_margin="@dimen/margin_xlarge"
    >

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />


    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/margin_standard"
        android:text="this is some text. "
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toEndOf="@id/checkbox"
        />

    <TextView
        android:id="@+id/id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/margin_large"
        android:text="123456789"
        app:layout_constraintBottom_toTopOf="@+id/negative"
        app:layout_constraintTop_toBottomOf="@id/description"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        />

    <Button
        android:id="@+id/positive"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/confirm"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginEnd="24dp"/>

    <Button
        android:id="@+id/negative"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="20dp"
        android:text="@string/cancel"
        app:layout_constraintBaseline_toBaselineOf="@id/positive"
        app:layout_constraintEnd_toStartOf="@id/positive"
        />


</android.support.constraint.ConstraintLayout>

问题:

  1. 为什么测得的宽度如此之大?
  2. 鉴于测得的宽度超过16,000,000,可以预期末端填充也会偏离屏幕。为什么它可见?
  3. 如何解决这些问题,以便能够显示包含其内容的常规对话框?
  4. 编辑:我注意到删除填充似乎会导致宽度达到那么大的数量。保持填充会导致对话框保持屏幕边缘的正常边距,但会剪切内容。

2 个答案:

答案 0 :(得分:2)

我使用您的布局dialog_agreement.xml创建了一个示例应用,并且它运行正常:

enter image description here enter image description here

1。为什么测得的宽度如此之大?

布局dialog_agreement.xml指的是dimension resources

  • @dimen/margin_standard
  • @dimen/margin_large
  • @dimen/margin_xlarge

如果他们的值不适中,则会对话。

2。鉴于测量的宽度超过16,000,000,人们可以预期末端填充也会在屏幕外。为什么它可见?

根据the guide,每个儿童观点都希望其大小。但父视图最初考虑了自己的填充。因此,对话框将在屏幕大小内,并保留其填充。

  

视图的大小用宽度和高度表示。视图实际上具有两对宽度和高度值。

     

第一对称为测量宽度测量高度。这些维度定义了视图在其父级中的大小。 ...

     

第二对简称为宽度和高度,有时称为绘图宽度绘图高度。这些尺寸定义了屏幕上,绘图时和布局后视图的实际大小。这些值可以但不必与测量的宽度和高度不同。 ...

     

要测量其尺寸,视图会考虑其填充。 ...

3。如何解决这些问题,以便能够显示包含其内容的正常对话框?

res/values/dimens.xml中设置中等值:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="margin_standard">16dp</dimen>
    <dimen name="margin_large">16dp</dimen>
    <dimen name="margin_xlarge">16dp</dimen>
</resources>

示例应用显示AgreementDialog,如上面的屏幕截图所示。

答案 1 :(得分:-4)

尝试使用MaterialDialog作为内部片段的自定义对话框。这不是您的问题的正确答案,但它会简化您的工作。

https://github.com/afollestad/material-dialogs