安卓如何获取自定义对话框的全宽度

110

在我的应用程序中,我创建的自定义对话框不具有完整的高度,我无法更改和自定义它。例如,请参见此屏幕截图:

输入图像描述 我的代码:

final Dialog contacts_dialog = new Dialog(ActivityGroup.this, R.style.theme_sms_receive_dialog);
contacts_dialog.setContentView(R.layout.dialog_schedule_date_time);
contacts_dialog.setCancelable(true);
contacts_dialog.setCanceledOnTouchOutside(true);
contacts_dialog.show();

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layoutRoot"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@null"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_header_dialog_background"
        android:orientation="horizontal"
        android:padding="4dp" >

        <TextView
            android:id="@+id/TextView21"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginRight="5dp"
            android:layout_weight="2"
            android:gravity="center_vertical|right"
            android:text="@string/choose_schedule_time_date"
            android:textColor="#ffffff"
            android:textSize="14sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/ImageView03"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginTop="0dp"
            android:background="@drawable/icon_scudule_time" />
    </LinearLayout>

</LinearLayout>

样式:

<style name="theme_sms_receive_dialog" parent="android:style/Theme.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="numberPickerStyle">@style/NPWidget.Holo.Light.NumberPicker</item>
</style>
18个回答

184

您需要获取当前窗口并设置其 LayoutParams,方法如下:

Dialog d=new Dialog(mContext);
.........
.........
myDialog.show();
Window window = myDialog.getWindow();
window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

备选方案(如果上述解决方案不起作用)

如果上面的代码不能正常工作,您可以使用一个解决方法

styles.xml

<style name="mydialog"></style>

Java

对应的翻译是:

Java

Dialog d=new Dialog(mContext,R.style.mydialog);
.........
.........
myDialog.show();
Window window = myDialog.getWindow();
window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

我以前从未想过LayoutParams.MATCH_PARENT和LayoutParams.WRAP_CONTENT。谢谢... - Yusuf Çağlar
38
关键在于在调用show()之后设置它。如果在此之前设置,它将无法正常工作。这就是我的问题所在。谢谢。 - Vivek Mishra
是的,@VivekMishra,你说得对,这就是为什么我在show()之后添加它的原因。 - Abhishek Singh
1
当您制作自己的自定义对话框片段时,这种方法不起作用。我尝试在显示前和显示后设置布局参数...可行的方法是在onStart中设置它。 - user11736763
2
另外,添加以下代码: dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - Chetan Gaikwad

113

有两种方法可以实现,第一种是在style.xml中添加以下内容,将值(目前为90%)更改为满足您需求的值。

  1. 在style.xml中添加以下内容:

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    <item name="android:windowMinWidthMajor">90%</item>
    <item name="android:windowMinWidthMinor">90%</item>
</style>
将setlayout设置为match_parent。
 final Dialog contacts_dialog = new Dialog(ActivityGroup.this,
 R.style.theme_sms_receive_dialog);
 contacts_dialog.setContentView(R.layout.dialog_schedule_date_time);
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);

 contacts_dialog.setCancelable(true);
 contacts_dialog.setCanceledOnTouchOutside(true);
 contacts_dialog.show();

哦,对不起先生。我已经更新了帖子标题为“Android获取自定义对话框的全宽度”。 - DolDurma
4
只需使用上述代码,并将宽度设为100% <item name="android:windowMinWidthMinor">100%</item> - Psypher
1
谢谢您。我现在遇到了这个错误:windowMinWidthMinor需要API级别11(当前最低级别为8) - DolDurma
完美地符合我的需求!!谢谢 - Manza
@DolDurma,我们现在可以安全地放弃对API 11的支持了 :) - milosmns

22

如果要创建全宽度对话框,可以为对话框创建自定义样式。下面是全宽度对话框的代码:

<style name="Custom_Dialog" parent="ThemeOverlay.AppCompat.Light" >
    <item name="windowMinWidthMajor">100%</item>
    <item name="windowMinWidthMinor">65%</item>
</style>
为了将此样式分配给对话框的构造函数,在setContentView()之后,将以下内容添加到onCreate()方法中:
getWindow()
    .setLayout(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.WRAP_CONTENT
    );

4
在调用setContentView()之后添加setLayout()函数真的帮了我很多,谢谢! - Riki
有没有办法以像素为单位获取“windowMinWidthMajor”的值,即使它被设置为其他类型的值,例如百分比?如何实现? - android developer
谢谢。我只指定了百分比,这样当处于分屏模式时,对话框就不会缩小到20-30%的宽度了。 - Nicolas

20

如果有人想知道如何在使用DialogFragment显示的对话框中实现此操作,您可以重写onCreateDialog方法,返回一个带有自定义样式的对话框,该样式具有windowMinWidthMajorwindowMinWidthMinor设置为90%。

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(getActivity(), R.style.WideDialog);
}

风格:

<style name="WideDialog" parent="Base.Theme.AppCompat.Dialog">
    <item name="android:windowMinWidthMajor">90%</item>
    <item name="android:windowMinWidthMinor">90%</item>
</style>

18

您不需要为此添加任何样式,只需尝试以下方法:

  Dialog dialog = new Dialog(context);
  dialog.setContentView(R.layout.your_layout_here);
  dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  dialog.show();

注意:在处理器内使用空的style会消耗内存和时间。建议直接使用dailog.getWindow().setLayout(width,height)


这是最简单的解决方案,因为我们是从类中创建对话框。 - Al Nafis

15

使用相对布局(Relative Layout)代替线性布局(Linear Layout)以获得自定义对话框的全屏宽度。


10

尝试将您的对话框布局包含在RelativeLayout中


这是唯一修复我的问题的方法,谢谢您先生。 - SKREFI
你能为此作出解释吗? - Moustafa EL-Saghier

5

对于Kotlin用户

    val layoutParams = dialog.window!!.attributes
    layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT
    dialog.window!!.attributes = layoutParams

或者

    val width = resources.displayMetrics.widthPixels
    val height = dialog.window!!.attributes.height
    dailog.window!!.setLayout(width, height)

4
Dialog dialog = new Dialog(BASE_CONTEXT, R.style.Theme_Dialog);  
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);  
dialog.setContentView(R.layout.your_layout);  
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

3
在我的情况下,自定义对话框的宽度会随着对话框内部内容宽度变小而缩小,即使已经设置了宽度属性。
android:layout_width="match_parent"

我刚把宽度设置为屏幕大小,现在根据我的要求运行正常。

android:layout_width="320dp"

解决了我的问题。 - Ranjithkumar
这不是响应式的。 - Mr. Robot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接