So machen Sie die DialogFragment-Breite zu Fill_Parent


95

Ich arbeite an einer Android-Anwendung, in der ich DialogFragmentden Dialog anzeige, dessen Breite jedoch sehr gering ist. Wie kann ich diese Breite fill_parentdazu machen?

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
Tatsächlich wird das exakt gleiche Layout mit RelativeLayout sehr gut angezeigt. Ich erkläre das aber nicht ...
Dan Chaltiel

Antworten:


153

Dies ist die Lösung, die ich gefunden habe, um dieses Problem zu lösen:

@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));
    }
}

Bearbeiten:

Sie können den folgenden Code in der onCrateViewMethode Fragment verwenden, bevor Sie die aufgeblasene Ansicht zurückgeben.

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

3
Sie können einfach anrufendialog.getWindow().setBackgroundDrawable(null);
edwardaa

Wenn es auf null gesetzt ist, ist es nicht transparent ... nur schwarz, am 4.0.4
Joao Polo

17
Bei mir funktioniert es, wenn ich getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);die onResume()Methode von DialogFragment eingebe . Bei der onCreateView()Methode hat es nicht funktioniert . Ich habe die Antwort leicht von dialogauf geändert getDialog().
Rock Lee

2
setLayoutin der onStartMethode funktioniert perfekt. Vielen Dank.
Wonsuc

77

Haben Sie versucht, die Antwort von Elvis aus So verwenden Sie einen Warndialog, der 90% der Bildschirmgröße ausfüllt ?

Es ist das Folgende:

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

Aktualisieren:

Der obige Code sollte innerhalb der onStart()Methode des hinzugefügt werden DialogFragment.


4
Welche LayoutParams haben Sie importiert?
Ymerdrengene

1
@ymerdrengene Sehr gute Frage eigentlich. Versuchen Sie es WindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce

2
@ymerdrengene Obwohl technisch gesehen, erben sie alle nur diesen Wert von ViewGroup.LayoutParams, so dass es in beiden Fällen einwandfrei funktioniert.
EpicPandaForce

9
Dieser Code muss sich in der onStartMethode des DialogFragments befinden, damit er funktioniert.
Eborbob

1
Wie hier erwähnt stackoverflow.com/a/15279400/1641882 Ich würde vorschlagen, diesen Code nachonCreateDialog
Ishan

51

Das ist für mich gearbeitet

Erstellen Sie Ihren benutzerdefinierten Stil:

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

Verwenden Sie diesen Stil in Ihrem Dialog

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
schöne Lösung mit <item name = "android: windowBackground"> ​​@ null </ item>.
Evgeny Sinitsky

1
funktioniert super, vielen Dank
Herman

28

Bei mir hat es funktioniert, als ich das LinearLayout-übergeordnete Element des in onCreateView aufgeblasenen Layouts durch RelativeLayout ersetzt habe. Keine weitere Codeänderung erforderlich.


6
Typisch, immer die unbeliebteste Antwort auf Stapelüberlauf löst mein Problem. Danke
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" />

oben in meinem Dialog Layout hat den Trick gemacht.


3
Dies funktioniert für mich und ich mag es, dass wir nichts extra im Code hinzufügen müssen, aber ich frage mich, warum es funktioniert ...
Shela

Unglaublich, das ist das einzige, was für mich funktioniert hat. Benutzerdefinierter Stil nicht.
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);
    }
}

Wenn Sie mehr Flexibilität wünschen, können Sie AppCompat_Dialog_Alert und benutzerdefinierte Attribute erweitern


11

In meinem Fall habe ich auch den folgenden Ansatz verwendet:

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

Bei einigen Lollipop + -Geräten (z. B. Nexus 9) gab es jedoch immer noch kleine Lücken zwischen dem linken und rechten Rand des Dialogfelds und den Bildschirmkanten.

Es war nicht offensichtlich, aber schließlich habe ich herausgefunden, dass der Fensterhintergrund in der Datei styles.xml wie folgt angegeben werden sollte , damit er auf allen Geräten und Plattformen in voller Breite angezeigt wird :

<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>

Und natürlich muss dieser Stil verwendet werden, wenn wir den Dialog wie folgt erstellen:

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

2
Dies sollte die akzeptierte Antwort sein! Hat mir so viel Zeit gespart! Der Fensterhintergrund hat es geschafft.
Karan

11

Basierend auf anderen Lösungen habe ich meine eigenen erstellt.

<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

Ich möchte das klarstellen. Beide Wege sind richtig, aber mit unterschiedlichem DialogFragment .

Verwenden von 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);
    }
}

Verwenden von 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);
}

Grundsätzlich brauchte ich volle Breite und das hat funktioniert. Vielen Dank!
Sud007

4

Eine andere Lösung, die für mich ohne Nebenwirkungen funktioniert, war:

In Ihrer Klasse, die DialogFragment erweitert:

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

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

In Ihren Stilen:

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

Sie können das Alarmthema direkt insetStyle()
Sony

3

Das funktioniert bei mir perfekt.

android:minWidth="300dp"

Hierdurch können Sie dem Dialogfragment die Breite geben.


2

Erstellen Sie einen benutzerdefinierten Stil in Ihrer Datei style.xml. Kopieren Sie einfach diesen Code und fügen Sie ihn in Ihre style.xml-Datei ein

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

Erstellen Sie dann in der Methode createDialog Ihres DialogFragments das Dialogobjekt anhand des Codes

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

Das funktioniert bei mir und ich hoffe, das hilft auch Ihnen


Ich musste dem Stil Folgendes hinzufügen, damit er für mich funktioniert: <item name = "android: windowMinWidthMajor"> 100% </ item> <item name = "android: windowMinWidthMinor"> 100% </ item>
Arnout

2

So habe ich es gelöst, als ich mit diesem Problem konfrontiert wurde. Versuche dies.

Fügen Sie diesen Code in onActivityCreated Ihres DialogFragments entsprechend Ihren Anforderungen hinzu.

 @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

Verwenden Sie dies in der onCreateView-Methode von DialogFragment

    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 ist die Höhe des Dialogfragments. Ändern Sie es nach Ihren Wünschen


1

Benutzer AlertDialog.Builder in Ihrem DialogFragment. Fügen Sie es in dieser onCreateDialogMethode hinzu. Und onCreateViewnichts tun.

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

Setzen Sie in Ihrem Layout-Stammverzeichnis android: minWidth auf einen sehr großen Wert, z

<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

Ich habe mehrere oben aufgeführte Antworten ausprobiert. Sie haben nicht für mich gearbeitet. Dies ist die Lösung für mein Problem:

In DialogFragment(), fügen Sie die folgenden Codes:

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)
        }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.