2016-03-23 6 views
1

Ich implementiere einen Dialog mit zwei Feldern EditText. Gemäß den Material Design-Spezifikationen sollte diese Art von Dialog auf kleineren Geräten im Vollbildmodus angezeigt werden, während sie auf großen Bildschirmen in einem Dialogfenster angezeigt werden sollte.DialogFragment als Dialog angezeigt Ändert die Größe des Vollbilds bei Orientierungsänderung

Um dies zu erreichen, habe ich die Implementierung von der developer.android.com guide on Dialogs gefolgt.

Dies funktioniert gut für kleinere Bildschirme, aber für große Bildschirme belegt das Dialogfenster nach einer Orientierungsänderung den ganzen Bildschirm.

-Code zur Darstellung des DialogFragment (Teil onOptionsItemSelected() in meinem AppCompatActivity)

mIsLargeLayout = getResources().getBoolean(R.bool.large_layout); 

FragmentManager fragmentManager = getSupportFragmentManager(); 
mDialog = MyDialogFragment.newInstance(mIsLargeLayout); 

if (mIsLargeLayout) 
{ 
    // The device is using a large layout, so show the fragment as a dialog 
    mDialog.show(fragmentManager, "dialog"); 
} 
else 
{ 
    // The device is smaller, so show the fragment fullscreen 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    // 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, mDialog, "dialog") 
        .addToBackStack(null) 
        .commit(); 
} 

Für die DialogFragment, ich zum ersten Mal onCreateView() außer Kraft setzen zu meinen benutzerdefinierten Layout aufblasen:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
    setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme); 

    View v = inflater.inflate(R.layout.dialog_filter_audio_files, 
           container, false); 

    // code for Buttons and EditTexts here: 
    // set listeners etc. 

    return v; 
} 

... und dann onCreateDialog() mit den folgenden Aussagen:

Dialog dialog = super.onCreateDialog(savedInstanceState); 
dialog.setCancelable(true); 
dialog.getWindow().setBackgroundDrawableResource(R.color.c_background_dark); 
return dialog; 

ich nicht entlassen, die DialogFragment auf Änderung Orientierung aber in onRestoreInstanceState() ich wieder an die DialogFragment wie folgt aus:

mDialog = (DialogFilterAudiofiles) getSupportFragmentManager().findFragmentByTag("dialog"); 

Während der Benutzer in der Lage, den Dialog ganz gleich, zu vervollständigen, wie es aussieht, würde ich Ich mag es, den Dialog klein zu halten - genau wie vor der Orientierung.

Natürlich könnte ich den Dialog in onSaveInstanceState() nach dem Speichern der Eingabe so weit entlassen und dann einen neuen Dialog in onRestoreInstanceState() zeigen. Oder ich könnte mit DialogFragment s basierend auf AlertDialog und setContentView() arbeiten, wenn die Bildschirmgröße groß ist.

Gibt es eine andere Möglichkeit, den Beispielcode aus dem Handbuch zu beheben?

BEARBEITEN Ich möchte so nah wie möglich an der "ein Layout passt für alle Größen" -Ansatz bleiben.

Meine Implementierung von "onCreateView()" ist inspiriert von, aber erweitert den Beispielcode, also habe ich den relevanten Teil im obigen Text hinzugefügt.

Antwort

3

ich endlich die Ursache des Problems gefunden:

setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme);

funktioniert zunächst: die DialogFragment wird als Vollbild-Dialog erstellt oder in einem kleinen Fenster, abhängig vom Wert von mIsLargeLayout.

Wenn es jedoch nach einer Konfigurationsänderung neu erstellt werden muss, bewirkt diese Zeile, dass es im Vollbildmodus angezeigt wird.

Meine Erwartung war, dass der Wert R.style.AppTheme würde die Laufzeit den benutzerdefinierten Dialogstiles nachschlagen machen, die einen Teil des App Themas war, aber in der Tat behandelt es nur die DialogFragment als eine Art Activity wenn nach einer Konfiguration neu erstellen Veränderung.

Optional eigenes Thema: sowie mit

setStyle(DialogFragment.STYLE_NORMAL, 0); 

Vom documentation für den zweiten Parameter

In meinem Fall war die ganze Aussage fallen. Wenn 0, wird ein passendes Thema (basierend auf dem Stil) für Sie ausgewählt.

0

Definieren Sie im Root-Element Ihres Layouts Größen, die den Bildschirm Ihres Dialoglayouts für Ihre größeren Geräte nicht füllen. Wenn das nicht funktioniert, siehe how-to-set-a-maximum-height-with-wrap-content-in-android

+0

Kann ich bei diesem Ansatz immer noch Vollbilddialoge für kleine Geräte verwenden? Das Beispiel aus dem Handbuch schlug vor, dass für beide Optionen ein und dasselbe Layout verwendet werden kann. Mit - OK - einige Tasten zum Ausblenden hier und ein Menü zum Aufblasen. Das Fragment erhält den Wert "mIsLargeLayout" und passt sich an die Situation an – 0X0nosugar

Verwandte Themen