具有自定义视图的警报对话框:调整大小以包装视图的内容
我在正在构建的应用程序中一直遇到此问题。请忽略所有的设计缺点和缺乏最佳实践方法,这纯粹是为了展示我无法解决的问题的一个例子。
我有它返回一个基本与自定义集使用.如果这有特定的大小要求,我如何正确调整自身大小以显示自定义中的所有内容?DialogFragment
AlertDialog
View
AlertDialog.Builder.setView()
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);
}
}
}
}
将创建 A,单击一下即可打开 。自定义 () 的宽度必须为 800,高度为 300,这在 覆盖 中正确设置。这将以洋红色绘制其测量的边界以进行调试。Button
DialogFragment
View
myView
onMeasure()
View
800 宽度比我设备上的默认大小宽,但被剪切而不是正确拉伸。Dialog
我研究了以下解决方案:
我推断出以下两种编码方法:
- 获取 的 并使用 覆盖它们
WindowManager.LayoutParams
Dialog
myDialog.getDialog().getWindow().get/setAttributes()
- 使用方法通过
setLayout(w, h)
myDialog.getDialog().getWindow().setLayout()
我已经在我能想到的任何地方都尝试过它们(覆盖,在创建和显示之后,在,等等),并且如果提供特定值,通常可以使这两种方法正常工作。但无论何时提供,都不会发生任何事情。onStart()
onShowListener
Dialog
LayoutParams
WRAP_CONTENT
有什么建议吗?
编辑:
情况截图:
特定值的屏幕截图(此处输入了注释 900,850 未覆盖视图的整个宽度,考虑到正在调整整个窗口,这是有道理的。因此,如果需要另一个 ,则提供基本原因/固定值不合适的原因):WRAP_CONTENT