support - android studio alert dialog box




DialogFragment im Vollbildmodus in Android (14)

Ich versuche, ein DialogFragment im Vollbildmodus zu zeigen. Aber irgendwie kann ich das nicht.

Die Art, wie ich das Fragment zeige, stammt direkt aus der Android-Entwicklerdokumentation

FragmentManager f = ((Activity)getContext()).getFragmentManager();
FragmentTransaction ft = f.beginTransaction();
Fragment prev = f.findFragmentByTag("dialog");
if (prev != null) {
    ft.remove(prev);
}
ft.addToBackStack(null);

// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");

Ich weiß naiv versucht, das RelativeLayout im Fragment auf fill_parent und einige minWidth und minHeight zu setzen.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"  
    android:minWidth="1000px" 
    android:minHeight="600px"
    android:background="#ff0000">

Ich würde wissen, dass das DialogFragment den größten Teil des Bildschirms ausfüllt. Aber ich scheint nur vertikal zu skalieren, aber nur bis zu einer bestimmten horizontalen Breite.

Ich habe auch versucht, die Fensterattribute im Code festzulegen, wie hier vorgeschlagen: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec . Aber das hat auch nicht geholfen.

Ich verstehe wahrscheinlich etwas darüber, wie Android Dialoge handhabt, da ich brandneu bin. Wie kann ich so etwas tun? Gibt es alternative Möglichkeiten, mein Ziel zu erreichen?

Android-Gerät:
Asus EeePad Transformator
Android 3.0.1

Update: Ich habe es jetzt geschafft, es in den Vollbildmodus zu bringen, mit dem folgenden Code im Fragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}

Leider will ich das nicht ganz wollen. Ich brauche definitiv einen kleinen "Padding" um den Dialog, um den Hintergrund zu zeigen.

Irgendwelche Ideen, wie man das erreicht?


Erstellen Sie DialogFragment im Vollbildmodus, indem Sie nur den Stil verwenden

Erste Wahl

1. Fügen Sie Ihrer style.xml :

    <style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:padding">0dp</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

2. Fügen Sie zu Ihrem DialogFragment hinzu:

@Override
public int getTheme() {
    return R.style.FullScreenDialog;
}

Zweite Option

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme)
}

Dabei ist AppTheme das Thema, das Sie in Stilen definiert haben.


Chirag Nagariya hat Recht, außer dem Zusatz "_Fullscreen". Es kann mit jedem Basisstil gelöst werden, der nicht vom Dialogstil abgeleitet ist. 'android.R.style.Theme_Black_NoTitleBar' kann ebenfalls verwendet werden.


Das müssen Sie auf Fragment setzen:

/* theme is optional, I am using leanback... */
setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);

In Ihrem Fall:

DialogFragment newFragment = new DetailsDialogFragment();
newFragment.setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
newFragment.show(ft, "dialog");

Und warum? Weil DialogFragment (wenn nicht explizit erwähnt) seine inneren Stile verwendet, die Ihr benutzerdefiniertes Layout darin einhüllen (kein Vollbild usw.).

Und Layout? Kein hacky Weg benötigt, das funktioniert gut:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    ...
</RelativeLayout>

Genießen


Der folgende Weg funktioniert auch, wenn Sie an einem relativen Layout arbeiten. Befolgen Sie die folgenden Schritte:

  1. Zum Themeneditor gehen (Verfügbar unter Extras-> Android -> Themeneditor)
  2. Wählen Sie alle Themen anzeigen aus. Wählen Sie das mit AppCompat.Dialog
  3. Wählen Sie die Option Android-Fenster Hintergrund, wenn Sie möchten, dass es einen bestimmten farbigen Hintergrund oder einen transparenten Hintergrund hat.
  4. Wählen Sie die Farbe und drücken Sie OK. Wählen Sie einen Namen für das neue Thema.
  5. Gehe zu styles.xml und füge dann unter dem gerade hinzugefügten Thema diese beiden Attribute hinzu:

    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    

Meine Themeneinstellung für den Dialog lautet wie folgt:

<style name="DialogTheme" parent="Theme.AppCompat.Dialog" >
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>

Stellen Sie sicher, dass das Thema ein übergeordnetes Thema als Theme.AppCompat.Dialog hat. Ein anderer Weg wäre, einen neuen Stil in styles.xml zu erstellen und ihn wie oben beschrieben zu ändern.

  1. Wechseln Sie zu Ihrer Dialog Fragment-Klasse, und legen Sie in der onCreate () -Methode den Stil Ihres Dialogs wie folgt fest :

    @Override public void onCreate (@Nullable-Paket savedInstanceState) {super.onCreate (savedInstanceState); setStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }


Es kann tatsächlich davon abhängen, wie das Layout definiert ist. Um jedoch sicherzustellen, dass der Dialog die erforderliche Größe erhält, ist es die beste Lösung, die LayoutParams bereitzustellen, sobald das Dialogfeld angezeigt wird (und nicht beim Erstellen). In einem DialogFragment wird der Dialog für die onStart- Methode angezeigt. Daher ist eine gültige Methode zum Erhalten der vollen Breite:

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

Um ein Thema oder einen Stil wie einen NO_TITLE-Stil bereitzustellen, ist der beste Ort die onCreate- Methode:

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
}

Für den Fall, dass jemand darüber stolpert, hatte ich eine ähnliche Erfahrung, aber es stellte sich heraus, dass ich vergessen hatte, die inflationierte Ansicht von onCreateView zurückzugeben (stattdessen die Standardanzeige super.onCreateView zurückzugeben). Ich gab einfach die korrekte aufgeblasene Ansicht zurück und das löste das Problem.


Ich habe das Problem bereits bei der Verwendung eines Vollbild-Dialogfragments erkannt: Es gibt immer eine Auffüllung, während der Vollbildmodus aktiviert ist. Probieren Sie diesen Code in der onActivityCreated () Methode von dialogFragment aus:

public void onActivityCreated(Bundle savedInstanceState)
{   
    super.onActivityCreated(savedInstanceState);
    Window window = getDialog().getWindow();
    LayoutParams attributes = window.getAttributes();
    //must setBackgroundDrawable(TRANSPARENT) in onActivityCreated()
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    if (needFullScreen)
    {
        window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

In meinem Fall habe ich den folgenden Ansatz verwendet:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

Plus LinearLayout, um den ganzen Raum mit Inhalt zu füllen.

Bei einigen Lollipop + Geräten (zB Nexus 9) gab es aber immer noch kleine Lücken zwischen den linken und rechten Kanten des Dialogs und den Bildschirmrändern.

Es war nicht offensichtlich, aber schließlich fand ich heraus, dass der Fensterhintergrund in der Datei styles.xml wie folgt angegeben werden sollte, um die Breite über alle Geräte und Plattformen hinweg zu erhöhen :

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

Soweit die Android-API aktualisiert wurde, lautet die empfohlene Methode zum Anzeigen eines Vollbilddialogs wie folgt:

FragmentTransaction transaction = this.mFragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, this.mFragmentToShow).commit();

Wenn Sie nicht möchten, dass es im Vollbildmodus angezeigt wird, können Sie folgendermaßen vorgehen:

this.mFragmentToShow.show(this.mFragmentManager, LOGTAG);

Ich hoffe es hilft.

BEARBEITEN

Seien Sie sich bewusst, dass die Lösung, die ich gegeben habe, funktioniert, aber eine Schwäche hat, die manchmal problematisch sein könnte. Wenn Sie dem Container android.R.id.content das android.R.id.content DialogFragment android.R.id.content , können Sie die Funktion " DialogFragment#setCancelable() korrekt verarbeiten und zu unerwarteten Verhalten führen, wenn Sie das DialogFragment selbst dem Backstack hinzufügen.

Daher habe ich Ihnen vorgeschlagen, den Stil Ihres DialogFragments in der onCreate-Methode wie folgt zu ändern:

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

Ich hoffe es hilft.


Um DialogFragment im Vollbildmodus zu erhalten

onStart Sie onStart Ihres DialogFragments folgendermaßen:

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

Und vielen Dank an diesen Beitrag: techrepublic.com/article/…


Versuchen Sie dies für den allgemeinen Fragmentdialog für mehrere Verwendungen. Hoffe, das wird dir besser helfen

public class DialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_visit_history_main, container, false);

        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        initializeUI(rootView);
        return rootView;
    }

    @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);
        }
    }
    private void initializeUI(View rootView) {
    //getChildFragmentManager().beginTransaction().replace(R.id.fv_container,FragmentVisitHistory.getInstance(), AppConstant.FRAGMENT_VISIT_HISTORY).commit();
    }
}

Versuchen Sie setStyle () in onCreate zu verwenden und überschreiben Sie onCreateDialog make dialog ohne Titel

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

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);        
    return dialog;
}

oder überschreiben Sie onCreate () und setStyle den Code.

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

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity(), android.R.style.Theme_Holo_Light);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

    return dialog;
}

Diese Lösung wendet ein Vollbild-Design auf den Dialog an, das ähnlich wie Chirags SetStyle in onCreate ist. Ein Nachteil ist, dass savedInstanceState nicht verwendet wird.


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

setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);

}




android-dialogfragment