使对话框尽可能多地放置最大尺寸

时间:2018-03-09 21:00:37

标签: android android-dialog android-constraintlayout android-layoutparams

我有一个带有ConstraintLayout的AlertDialog作为视图,所有子节点的高度都为0dp,即匹配约束:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:maxHeight="400dp">

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <!-- Other children -->

我希望对话框在屏幕上尽可能多地占用高度,最多为400dp。但是,上面的布局会生成一个0高度的对话框,不可见。

我尝试使用dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)。该对话框占据了整个屏幕高度,但ConstraintLayout仍然不可见。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

我深入研究Android的源代码后找到了解决方案。下面的代码找到对话框可以采用的最大尺寸,并将其与我自己的最大尺寸进行比较。之后,我手动设置对话框的大小和视图的大小。

printf()

注意:private int dialogMaxWidth = 1200; // don't do that private int dialogMaxHeight = 1200; @Override public @NonNull Dialog onCreateDialog(Bundle state) { View view = LayoutInflater.from(context).inflate(R.layout.my_dialog, null); final Dialog dialog = new Dialog(context); dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { // Get maximum dialog dimensions // Basically (screen size) - (dialog's drawable padding) Rect fgPadding = new Rect(); dialog.getWindow().getDecorView().getBackground().getPadding(fgPadding); DisplayMetrics metrics = context.getResources().getDisplayMetrics(); int height = metrics.heightPixels - fgPadding.top - fgPadding.bottom; int width = metrics.widthPixels - fgPadding.top - fgPadding.bottom; // Set dialog's dimensions if (width > dialogMaxWidth) width = dialogMaxWidth; if (height > dialogMaxHeight) height = dialogMaxHeight; dialog.getWindow().setLayout(width, height); // Set dialog's content view.setLayoutParams(new ViewGroup.LayoutParams(width, height)); dialog.setContentView(view); } }); return dialog; } 可以替换为context