如何使DialogFragment宽度变为Fill_Parent


95

我正在使用一个Android应用程序DialogFragment来显示对话框,但是它的宽度很小。我怎样才能做到这fill_parent一点呢?

public class AddNoteDialogFragment extends DialogFragment {

    public AddNoteDialogFragment() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        getDialog().setTitle(getString(R.string.app_name));
        View view = inflater.inflate(R.layout.fragment_add_note_dialog,
                container);

        return view;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        // request a window without the title
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

        return dialog;
    }
}

fragment_add_note_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <EditText
        android:id="@+id/addNoteEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="@string/clock_enter_add_note"
        android:imeOptions="actionDone"
        android:inputType="textCapSentences|textMultiLine"
        android:lines="5" />

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@drawable/login_button"
        android:text="@string/submit_button"
        android:textColor="@android:color/white" />

</LinearLayout>


3
实际上,使用RelativeLayout完全相同的布局显示得很好。但我不解释...
Dan Chaltiel 2015年

Answers:


153

这是我想出的解决此问题的解决方案:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);    
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    return dialog;
}

@Override
public void onStart() {
    super.onStart();

    Dialog dialog = getDialog();
    if (dialog != null) {
       dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
       dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }
}

编辑:

onCrateView返回膨胀视图之前,可以在Fragment方法中使用以下代码。

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

3
您可以致电dialog.getWindow().setBackgroundDrawable(null);
edwardaa

如果将其设置为null,则它不是透明的...仅在4.0.4上为黑色
Joao Polo

17
对我来说,如果我getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);输入DialogFragment的onResume()方法,它将起作用。该onCreateView()方法无效。我将答案从略微修改dialoggetDialog()
摇滚李

2
setLayout在该onStart方法中工作完美。谢谢。
wonsuc

78

您是否尝试过使用“ 如何使警报对话框填充屏幕大小的90%”中的猫王的答案?

内容如下:

dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

更新:

上面的代码应添加到的onStart()方法中DialogFragment


4
您导入了哪些LayoutParams?
ymerdrengene

1
@ymerdrengene实际上是一个很好的问题。尝试WindowManager.LayoutParams.FILL_PARENT
EpicPandaForce 2015年

2
@ymerdrengene尽管从技术上讲,它们都是从继承此值ViewGroup.LayoutParams,所以无论哪种方式,它都可以正常工作。
EpicPandaForce 2015年

9
该代码将需要onStart在DialogFragment 的方法中起作用。
Eborbob 2015年

1
如此处所述stackoverflow.com/a/15279400/1641882我建议将代码移至onCreateDialog
Ishan 2016年

51

这对我有用

创建您的自定义样式:

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

在对话框中使用此样式

public class MessageDialog extends DialogFragment {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

// your code 
}

3
使用<item name =“ android:windowBackground”> @ null </ item>的漂亮解决方案。
Evgeny Sinitsky '18

1
工作非常好,非常感谢
Herman

28

对我来说,当我替换了由RelativeLayout在onCreateView中膨胀的布局的LinearLayout父级时,它起作用了。无需其他代码更改。


6
典型的,总是在堆栈溢出时最不受欢迎的答案解决了我的问题。谢谢
busuu

19
    <!-- A blank view to force the layout to be full-width -->
    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_gravity="fill_horizontal" />

在我的对话框布局的顶部做了did俩。


3
这对我有用,我喜欢它不需要我们在代码中添加任何额外内容,但是我想知道为什么它起作用……
shela

令人难以置信的是,这是唯一对我有用的东西。自定义样式没有。
Magnus W,

18
public class FullWidthDialogFragment extends AppCompatDialogFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
    }
}

如果需要更大的灵活性,可以扩展AppCompat_Dialog_Alert和自定义属性


11

就我而言,我还使用以下方法:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
    }
}

但是,对话框的左右边缘与某些Lollipop +设备(例如Nexus 9)的屏幕边缘之间仍然存在小间隙

这并不明显,但最终我发现要使其在所有设备和平台上全宽,应在styles.xml中指定窗口背景,如下所示:

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowBackground">@color/window_bg</item>
</style>

当然,当我们创建如下对话框时,需要使用这种样式:

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}

2
这应该是公认的答案!节省了我太多时间!窗口背景起到了作用。
卡兰

11

基于其他解决方案,我创建了自己的解决方案。

<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
    }
}

10

我想澄清一下。两种方法都是正确的,但是使用不同的DialogFragment

使用 android.app.DialogFragment

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

使用 android.support.v4.app.DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

基本上,我需要全角,这可行。谢谢!
sud007 '18 -10-16

4

另一种对我没有副作用的解决方案是:

在扩展DialogFragment的类中:

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

在您的样式中:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>

您可以直接在setStyle()
索尼

3

这完全适合我。

android:minWidth="300dp"

通过此操作,您可以为对话框片段指定宽度。


2

在style.xml文件中创建一个自定义样式。只需将这段代码复制粘贴到您的style.xml文件中

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" >
    <item name="android:windowBackground">@null</item>
    <item name="android:windowIsFloating">true</item>
</style>

然后在DialogFragment的createDialog方法中,通过代码创建对话框对象

 dialog = new Dialog(getActivity(), R.style.CustomDialog);

这对我有用,希望对您有帮助


我必须在样式中添加以下内容,以使其适合我:<item name =“ android:windowMinWidthMajor”> 100%</ item> <item name =“ android:windowMinWidthMinor”> 100%</ item>
Arnout

2

这是我遇到此问题时所解决的方法。试试这个。

在您的DialogFragment的onActivityCreated中,根据需要添加此代码...。

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
        intitviews();
        return myview;
    }
    @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getDialog().getWindow().setGravity(Gravity.CENTER);
    }

1

在DialogFragment的onCreateView方法中使用它

    Display display = getActivity().getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
    getDialog().getWindow().setLayout(width,px);

220是对话框片段的高度,根据需要更改


1

DialogFragment中的用户AlertDialog.Builder。onCreateDialog像这样添加它。而且onCreateView什么也没做。

public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
    final Bundle args = getArguments();
    String message = args.getString(GfConstant.EXTRA_DATA);
    TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
    txtMessage.setText(message);

    view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (mListener != null)
            {
                mListener.onDialogConfirmOK();
            }
        }
    });
    builder.setView(view);
    Dialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(false);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}

1

在布局根目录中,将android:minWidth设置为非常大的值,例如

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="9999999dp">

   ...

</LinearLayout>

0

我尝试了上面列出的多个答案;他们没有为我工作。这是我的问题的解决方案:

在中DialogFragment(),添加以下代码:

override fun onResume() {
    super.onResume()
    if (showsDialog) {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.WRAP_CONTENT
        dialog?.window?.apply {
            setBackgroundDrawable(ColorDrawable(Color.WHITE))
            attributes.gravity = Gravity.BOTTOM
            setLayout(width, height)
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.