我可以创建并显示一个自定义警报对话框,但即便如此,我android:layout_width/
在对话框xml中它只有内容一样大.
我想要的是填充整个屏幕的对话框,除了20像素的填充.然后,作为对话框一部分的图像将使用fill_parent自动拉伸到完整的对话框大小.
根据Android平台开发人员Dianne Hackborn在这个讨论组帖子中,Dialogs将他们Window的顶级布局宽度和高度设置为WRAP_CONTENT
.要使Dialog更大,可以将这些参数设置为MATCH_PARENT
.
演示代码:
AlertDialog.Builder adb = new AlertDialog.Builder(this); Dialog d = adb.setView(new View(this)).create(); // (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.) WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.copyFrom(d.getWindow().getAttributes()); lp.width = WindowManager.LayoutParams.MATCH_PARENT; lp.height = WindowManager.LayoutParams.MATCH_PARENT; d.show(); d.getWindow().setAttributes(lp);
请注意,在显示对话框后设置属性.系统在设置时很挑剔.(我猜布局引擎必须在第一次显示对话框时设置它们.)
最好通过扩展Theme.Dialog来做到这一点,然后你就不必玩一个关于何时调用setAttributes的猜谜游戏.(尽管让对话框自动采用适当的浅色或深色主题或Honeycomb Holo主题还有一些工作要做.这可以根据http://developer.android.com/guide/topics/ui/themes来完成. html#SelectATheme)
尝试将自定义对话框布局包装成RelativeLayout
而不是LinearLayout
.这对我有用.
像对方建议的那样在对话框窗口上指定FILL_PARENT对我来说不起作用(在Android 4.0.4上),因为它只是拉伸黑色对话框背景以填满整个屏幕.
什么工作正常是使用最小显示值,但在代码中指定它,以便对话框占用屏幕的90%.
所以:
Activity activity = ...; AlertDialog dialog = ...; // retrieve display dimensions Rect displayRectangle = new Rect(); Window window = activity.getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle); // inflate and adjust layout LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.your_dialog_layout, null); layout.setMinimumWidth((int)(displayRectangle.width() * 0.9f)); layout.setMinimumHeight((int)(displayRectangle.height() * 0.9f)); dialog.setView(layout);
通常,在大多数情况下仅调整宽度应该是足够的.
设置android:minWidth
并android:minHeight
在您的自定义视图xml中.这些可以强制警报不仅仅包装内容大小.使用这样的视图应该这样做:
更简单就是这样做:
int width = (int)(getResources().getDisplayMetrics().widthPixels*0.90); int height = (int)(getResources().getDisplayMetrics().heightPixels*0.90); alertDialog.getWindow().setLayout(width, height);
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
这里所有其他答案都有道理,但它不符合Fabian的需要.这是我的解决方案.它可能不是完美的解决方案,但它对我有用.它显示一个全屏对话框,但您可以在顶部,底部,左侧或右侧指定填充.
首先将它放在res/values/styles.xml中:
你可以看到我有android:paddingTop = 20dp基本上是你需要的.该机器人:windowBackground = @彩/ Black0Percent只是我color.xml声明的颜色代码
RES /值/ color.xml
#00000000
该Color代码仅用作虚拟对象,用0%透明度颜色替换Dialog的默认窗口背景.
接下来构建自定义对话框布局res/layout/dialog.xml
最后,我们的对话框设置了使用dialog.xml的自定义视图:
Dialog customDialog; LayoutInflater inflater = (LayoutInflater) getLayoutInflater(); View customView = inflater.inflate(R.layout.dialog, null); // Build the dialog customDialog = new Dialog(this, R.style.CustomDialog); customDialog.setContentView(customView); customDialog.show();
结论:我试图在名为CustomDialog的styles.xml中覆盖对话框的主题.它会覆盖Dialog窗口布局,让我有机会设置填充并更改背景的不透明度.它可能不是完美的解决方案,但我希望它可以帮助你.. :)
您可以使用百分比(JUST)窗口对话框宽度.
从Holo Theme看这个例子:
- 65%
您需要做的就是扩展此主题并将"Major"和"Minor"的值更改为90%而不是65%.
问候.
以下工作对我来说很好:
(注意:在之前的答案中建议的windowMinWidthMajor/Minor没有这个技巧.我的对话框根据内容不断改变大小)
然后:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogTheme);
实际90%计算的解决方案:
@Override public void onStart() { Dialog dialog = getDialog(); if (dialog != null) { dialog.getWindow() .setLayout((int) (getScreenWidth(getActivity()) * .9), ViewGroup.LayoutParams.MATCH_PARENT); } }
where getScreenWidth(Activity activity)
定义如下(最好放在Utils类中):
public static int getScreenWidth(Activity activity) { Point size = new Point(); activity.getWindowManager().getDefaultDisplay().getSize(size); return size.x; }
获取设备宽度:
public static int getWidth(Context context) { DisplayMetrics displayMetrics = new DisplayMetrics(); WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); windowmanager.getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.widthPixels; }
然后使用它来使对话框占设备的90%,
Dialog filterDialog = new Dialog(context, R.style.searchsdk_FilterDialog); filterDialog.setContentView(R.layout.searchsdk_filter_popup); initFilterDialog(filterDialog); filterDialog.setCancelable(true); filterDialog.getWindow().setLayout(((getWidth(context) / 100) * 90), LinearLayout.LayoutParams.MATCH_PARENT); filterDialog.getWindow().setGravity(Gravity.END); filterDialog.show();
好吧,你必须先设置对话框的高度和宽度才能显示(dialog.show())
所以,做这样的事情:
dialog.getWindow().setLayout(width, height); //then dialog.show()
到目前为止我能想到的最简单的方式 -
如果您的对话框是由垂直LinearLayout制作的,只需添加一个"高度填充"虚拟视图,它将占据屏幕的整个高度.
例如 -
请注意android:weightSum="1"
LinearLayout的属性和android:layout_weight="1"
虚拟View的属性