代码之家  ›  专栏  ›  技术社区  ›  Nicolas

使用最大尺寸尽可能多地创建对话框

  •  0
  • Nicolas  · 技术社区  · 7 年前

    我有一个以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 回复  |  直到 7 年前
        1
  •  0
  •   Nicolas    7 年前

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

    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 可以替换为 getActivity()

    推荐文章