我在正在构建的应用程序中遇到了这个问题。请忽略所有设计缺陷和缺乏最佳实践方法,这纯粹是为了展示我无法解决的问题。
我有DialogFragment一个使用. 如果这有特定的大小要求,我如何才能正确调整自身大小以显示自定义中的所有内容?AlertDialogViewAlertDialog.Builder.setView()ViewDialogView
这是我一直在使用的示例代码:
package com.test.test;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Use a button for launching
        Button b = new Button(this);
        b.setText("Launch");
        b.setOnClickListener(new OnClickListener() {    
            @Override
            public void onClick(View v) {
                // Launch the dialog
                myDialog d = new myDialog();
                d.show(getFragmentManager(), null);
            }
        });
        setContentView(b);
    }
    public static class myDialog extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {           
            // Create the dialog
            AlertDialog.Builder db = new AlertDialog.Builder(getActivity());
            db.setTitle("Test Alert Dialog:");
            db.setView(new myView(getActivity()));
            return db.create();
        }
        protected class myView extends View {
            Paint p = null;
            public myView(Context ct) {
                super(ct);
                // Setup paint for the drawing
                p = new Paint();
                p.setColor(Color.MAGENTA);
                p.setStyle(Style.STROKE);
                p.setStrokeWidth(10);
            }
            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                setMeasuredDimension(800, 300);
            }
            @Override
            protected void onDraw(Canvas canvas) {
                // Draw a rectangle showing the bounds of the view
                canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), p);
            }
        }
    }
}
AButton已创建,DialogFragment单击即可打开。custom View( myView) 需要具有 800 的宽度和 300 的高度,这在onMeasure(). ThisView以洋红色绘制其测量范围以用于调试目的。
800 宽度比Dialog我设备上的默认尺寸宽,但被剪裁而不是正确拉伸。
我查看了以下解决方案:
我推导出了以下两种编码方法:
- 获取WindowManager.LayoutParamsofDialog并使用myDialog.getDialog().getWindow().get/setAttributes()
- 使用setLayout(w, h)方法通过myDialog.getDialog().getWindow().setLayout()
我在我能想到的任何地方都尝试过它们(覆盖onStart()、在 a onShowListener、在创建和显示之后等),并且如果提供特定值Dialog,通常可以使这两种方法正常工作。但是,无论何时提供,都不会发生任何事情。LayoutParamsWRAP_CONTENT
有什么建议么?
编辑:
情况截图:

特定值的屏幕截图(注意在此处输入 900,850 不会覆盖视图的整个宽度,考虑到正在调整整个窗口,这是有道理的。因此,如果需要另一个,这提供了WRAP_CONTENT必要/固定的原因值不合适):


