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>

N Sharma
quelle
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));
Savepopulation
quelle
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.

EpicPandaForce
quelle
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 
}
Kishan Vaghela
quelle
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.

AA_PV
quelle
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.

RJ M.
quelle
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

Mehrdad Faraji
quelle
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;
}
goRGon
quelle
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)
    }
}
Владислав Стариков
quelle
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);
}
Khemraj
quelle
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>
Josiel Novaes
quelle
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.

Nouman Ch
quelle
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

emilpmp
quelle
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);
    }
Sharon Joshi
quelle
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

Saeed-rz
quelle
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;
}
Sohn Nguyen Thanh
quelle
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>
heeleeaz
quelle
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)
        }
    }
}
Eric Cen
quelle