如何在Android对话框的XML布局文件中指定正确的对话框大小?

我使用XML布局文件创build了一个android对话框,如下所示:

final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.enabledialog); dialog.setTitle("Define message keys and setup"); Switch locationSwitch = (Switch) dialog.findViewById(R.id.locationSwitch); Switch blareSwitch = (Switch) dialog.findViewById(R.id.blareSwitch); final EditText locationEdit = (EditText) dialog.findViewById(R.id.locationEdit); final EditText blareEdit = (EditText) dialog.findViewById(R.id.blareEdit); WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.copyFrom(dialog.getWindow().getAttributes()); lp.width = WindowManager.LayoutParams.MATCH_PARENT; lp.height = WindowManager.LayoutParams.MATCH_PARENT; dialog.show(); dialog.getWindow().setAttributes(lp); 

但是,我的XML文件的内容只占用了一半的屏幕,所以当我显示对话框时,我显示出额外的空间,看起来不太好:

这里是对话视图(R.layout.enabledialog)的简图:

在这里输入图像说明

我如何修剪这个额外的空间? 在android studio中,布局编辑器假定XML文件占用了整个屏幕,但实际上,我只想要一个小的popup窗口。

谢谢,

Ruchir


编辑:这是我的布局资源文件:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#1dd1e9"> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/locationSwitch" android:layout_marginTop="46dp" android:checked="false" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Blah" android:id="@+id/textView" android:textSize="30sp" android:layout_alignTop="@+id/locationSwitch" android:layout_centerHorizontal="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Blah Blah Blah" android:id="@+id/textView2" android:gravity="center" android:textSize="20sp" android:layout_below="@+id/locationSwitch" android:layout_centerHorizontal="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/locationEdit" android:layout_below="@+id/textView2" android:layout_alignLeft="@+id/textView" android:layout_alignStart="@+id/textView" android:layout_alignRight="@+id/textView" android:layout_alignEnd="@+id/textView" android:singleLine = "true" android:imeOptions="actionDone" /> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/blareSwitch" android:layout_marginTop="40dp" android:checked="false" android:layout_below="@+id/locationEdit" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Blah" android:id="@+id/textView3" android:textSize="30sp" android:layout_alignBottom="@+id/blareSwitch" android:layout_centerHorizontal="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Blah Blah Blah" android:id="@+id/textView4" android:textSize="20sp" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/blareEdit" android:layout_below="@+id/textView4" android:layout_alignLeft="@+id/locationEdit" android:layout_alignStart="@+id/locationEdit" android:layout_alignRight="@+id/locationEdit" android:layout_alignEnd="@+id/locationEdit" android:singleLine = "true" android:imeOptions="actionDone" /> </RelativeLayout> 

Solutions Collecting From Web of "如何在Android对话框的XML布局文件中指定正确的对话框大小?"

尝试在您的根RelativeLayout fill_parent更改为wrap_content ,并在Java代码WRAP_CONTENT更改为WRAP_CONTENT (或者删除整个setAttributes()位)。

我实际上已经在MATCH_PARENT,因为当它是WRAP_CONTENT,内容是重叠的,不适合

那么这是一个独立的问题,你需要修复。 首先获得对话框的大小,大致是你想要的。 然后,使用一些检查工具(AS 2.2中的新build工具,层次结构视图, uiautomatorviewer等)开始了解如何修复布局以避免重叠。

尝试将您的布局参数高度更改为:

lp.height = WindowManager.LayoutParams.WRAP_CONTENT;

我通常以编程方式设置LayoutParams 。 我想你可以在onResume中用下面的代码尝试DialogFragment

 /** * Setup position of dialog */ protected void setupDialogPosition() { // setup the dialog WindowManager.LayoutParams p = getDialog().getWindow().getAttributes(); p.width = ViewGroup.LayoutParams.MATCH_PARENT; py = 0; // change height of dailog if (mHeight == ViewGroup.LayoutParams.MATCH_PARENT) { p.height = mScreenHeight - py; if (isStatusBarVisible()) { p.height -= getStatusBarHeight(); } } else { p.height = ViewGroup.LayoutParams.WRAP_CONTENT; } getDialog().getWindow().setGravity(mGravity); getDialog().getWindow().setAttributes(p); } 

将RelativeLayout更改为LinearLayout:

 <LinearLayout android:layout_height="match_parent" android:layout_width="wrap_content" </LinearLayout> 

我在github中find了一个很好的资料库对话框。 请试试这个。 它将为您pipe理布局。

https://github.com/afollestad/material-dialogs

在您的相对布局中指定layout_height和layout_width,并且不要将其设置为fill_parent。 例:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="250dp" android:layout_height="wrap_content"> <TextView android:id="@+id/customdia_text" android:layout_marginTop="20dp" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_centerHorizontal="true" android:text="hello" /> <Button android:id="@+id/custdia_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Ok" android:layout_marginBottom="30dp" android:layout_marginTop="20dp" android:layout_below="@+id/customdia_text" android:layout_centerHorizontal="true"/> </RelativeLayout> 

直接从资源值转换:

 int width = getResources().getDimensionPixelSize(R.dimen.popup_width); int height = getResources().getDimensionPixelSize(R.dimen.popup_height); getDialog().getWindow().setLayout(width, height); 

在对话框的布局中现在match_parent

 android:layout_width="match_parent" android:layout_height="match_parent" android:layout_width="match_parent" android:layout_height="match_parent" 

希望这会帮助你。

按如下所示创build自定义对话框

 public class MyDialog extends Dialog { @Override public void onAttachedToWindow() { super.onAttachedToWindow(); WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.width = WindowManager.LayoutParams.MATCH_PARENT; lp.height = WindowManager.LayoutParams.WRAP_CONTENT; getWindow().setAttributes(lp); } public MyDialog(Context context) { super(context); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog); } } 

看看覆盖方法onAttachedToWindow(),这里是你的trick.this方法在onCreate()方法之前被调用。 所以你可以覆盖窗口属性(宽度和高度)之前,你的对话框被创build。

请按照以下步骤从您的活动中调用该对话框

 new MyDialog(ActivityContext).show(); 

也在dialog.xml文件中做一些修改

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical"> <Switch android:id="@+id/locationSwitch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginTop="46dp" android:checked="false" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/locationSwitch" android:layout_centerHorizontal="true" android:text="Blah" android:textAppearance="?android:attr/textAppearanceLarge" android:textSize="30sp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/locationSwitch" android:layout_centerHorizontal="true" android:gravity="center" android:text="Blah Blah Blah" android:textAppearance="?android:attr/textAppearanceSmall" android:textSize="20sp" /> <EditText android:id="@+id/locationEdit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignEnd="@+id/textView" android:layout_alignLeft="@+id/textView" android:layout_alignRight="@+id/textView" android:layout_alignStart="@+id/textView" android:layout_below="@+id/textView2" android:layout_marginBottom="50dp" android:imeOptions="actionDone" android:singleLine="true" /> </LinearLayout> 

编辑布局文件,如果你想任何额外的定制

根据xml文件中的要求更改Main RelativeLayout大小。 指定高度,你需要像波纹pipe

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="100dp" android:background="#1dd1e9"> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/locationSwitch" android:layout_marginTop="46dp" android:checked="false" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Blah" android:id="@+id/textView" android:textSize="30sp" android:layout_alignTop="@+id/locationSwitch" android:layout_centerHorizontal="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Blah Blah Blah" android:id="@+id/textView2" android:gravity="center" android:textSize="20sp" android:layout_below="@+id/locationSwitch" android:layout_centerHorizontal="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/locationEdit" android:layout_below="@+id/textView2" android:layout_alignLeft="@+id/textView" android:layout_alignStart="@+id/textView" android:layout_alignRight="@+id/textView" android:layout_alignEnd="@+id/textView" android:singleLine = "true" android:imeOptions="actionDone" /> <Switch android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/blareSwitch" android:layout_marginTop="40dp" android:checked="false" android:layout_below="@+id/locationEdit" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Blah" android:id="@+id/textView3" android:textSize="30sp" android:layout_alignBottom="@+id/blareSwitch" android:layout_centerHorizontal="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="Blah Blah Blah" android:id="@+id/textView4" android:textSize="20sp" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/blareEdit" android:layout_below="@+id/textView4" android:layout_alignLeft="@+id/locationEdit" android:layout_alignStart="@+id/locationEdit" android:layout_alignRight="@+id/locationEdit" android:layout_alignEnd="@+id/locationEdit" android:singleLine = "true" android:imeOptions="actionDone" /> </RelativeLayout> 

根据需求更改高度和宽度,并且不需要setAttributes(lp); 在Java中。 如果您正在设置,请确保您考虑xml RelativeLayout高度和宽度