我有一个使用AlertDialog.Builder.setView()设置自定义View的DialogFragment,返回一个基本的AlertDialog。如果此View需要特定的大小需求,如何使Dialog正确调整大小以显示自定义View中的所有内容?
以下是我一直在使用的示例代码:
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);
}
}
}
}
一个
Button
被创建,它在点击时打开 DialogFragment
。自定义的 View
(myView
) 需要有 800 的宽度和 300 的高度,这在 onMeasure()
的重写中被正确设置。这个 View
为了调试目的绘制了它的测量范围(magenta)。我的设备上默认的
Dialog
大小比 800 的宽度要窄,但是它被裁剪而不是正确地拉伸。我已经查看了以下解决方案: 我推导出了以下两种编码方法:
- 通过
myDialog.getDialog().getWindow().get/setAttributes()
获取并覆盖Dialog
的WindowManager.LayoutParams
- 使用
myDialog.getDialog().getWindow().setLayout()
方法中的setLayout(w, h)
我已经在所有我能想到的地方尝试过它们(在onStart()
中重写,在onShowListener
中,创建和显示Dialog
后等等),如果为LayoutParams
提供了一个特定的值,通常可以成功地使用这两种方法。但是每当提供WRAP_CONTENT
时,什么也不会发生。
有什么建议吗?
编辑:
情况的屏幕截图:
这是一个特定值的屏幕截图(注意此处输入了900,850不能覆盖整个视图的宽度,考虑到整个窗口正在调整,这是有道理的。因此,如果需要另一个原因,WRAP_CONTENT
是必不可少的/固定值不合适):