如何使DialogFragment宽度为Fill_Parent

N S*_*rma 78 android fragment android-fragments android-dialogfragment

您好我正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

提前致谢.

sav*_*ion 132

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

@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));
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,如果我把`getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);`放在DialogFragment的`onResume()`方法中.它不适用于`onCreateView()`方法.我将回答从`dialog`略微修改为`getDialog()`. (14认同)
  • 你可以调用`dialog.getWindow().setBackgroundDrawable(null);` (3认同)
  • `onStart` 方法中的 `setLayout` 完美运行。谢谢。 (2认同)

Epi*_*rce 69

您是否尝试使用Elvis的答案如何使警报对话框填充90%的屏幕尺寸?

它是以下内容:

dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
Run Code Online (Sandbox Code Playgroud)

更新:

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

LayoutParams.FILL_PARENT不推荐使用LayoutParams.MATCH_PARENT.

  • 这段代码需要在DialogFragment的`onStart`方法中才能工作. (9认同)
  • 你导入了哪些LayoutParams? (4认同)
  • @ymerdrengene 实际上是一个很好的问题。尝试“WindowManager.LayoutParams.FILL_PARENT”。 (3认同)
  • @ymerdrengene虽然从技术上讲,它们都只是从`ViewGroup.LayoutParams`继承了这个值,所以无论哪种方式都可以完美地运行. (2认同)
  • 导入 android.view.WindowManager; (2认同)

Kis*_*ela 39

这对我有用

创建自定义样式:

   <style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
   </style>
Run Code Online (Sandbox Code Playgroud)

在对话框中使用此样式

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 
}
Run Code Online (Sandbox Code Playgroud)

  • &lt;item name="android:windowBackground"&gt;​​@null&lt;/item&gt; 的漂亮解决方案。 (4认同)
  • 请注意使用正确的父对话框来匹配您的其他对话框。就我而言,它是 ThemeOverlay.AppCompat.Dialog (2认同)

AA_*_*_PV 21

对我来说,当我用RelativeLayout替换onCreateView中膨胀的布局的LinearLayout父级时,它可以工作.无需更改其他代码.

  • 堆栈溢出的典型,总是最不受欢迎的答案解决了我的问题.谢谢 (5认同)
  • 无法理解背后的逻辑,但真正的魔力. (3认同)

小智 18

    <!-- 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" />
Run Code Online (Sandbox Code Playgroud)

在我的对话框布局的顶部做了伎俩.

  • 这适用于我,我喜欢它不要求我们在代码中添加任何额外的东西,但我想知道_why_它的工作原理...... (3认同)

Meh*_*aji 14

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想要更多的灵活性可以扩展AppCompat_Dialog_Alert和自定义属性


小智 12

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

<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>
Run Code Online (Sandbox Code Playgroud)
abstract class BaseDialogFragment : DialogFragment() {

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


goR*_*Gon 10

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

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

但是对话框的左右边缘和一些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>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这应该是公认的答案!救了我这么多时间!窗口背景成功了. (2认同)

Khe*_*raj 6

我想澄清一下。两种方法都是正确的,但是使用不同的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 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);
}
Run Code Online (Sandbox Code Playgroud)