2013-11-15 1 views
11

Meine Aktivität deklariert alle GUI-Fragmente in einem einzigen XML-Layout. Es muss nur einige der Fragmente zum Zeitpunkt des Starts anzeigen; Der Rest wird angezeigt, wenn der Benutzer mit der App interagiert. Ein Teil des Layouts ist wie folgt:Wie kann ich ein Fragment als in einem XML-Layout verborgen deklarieren?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <fragment 
     android:id="@+id/map_panel" 
     android:name="com.example.MapPanel" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/map_panel_height" /> 
    <fragment 
     android:id="@+id/list_panel" 
     android:name="com.example.ListPanel" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/map_panel" /> 
    <fragment 
     android:id="@+id/detail_panel" 
     android:name="com.example.DetailPanel" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/map_panel" 
     android:visibility="gone" /> 

Meine Absicht ist es, dass das list_panel Fragment beim Start zu sehen ist, und das detail_panel Fragment ist verborgen, bis der Benutzer etwas aus der Liste auswählt.

Standardmäßig beginnt ein Fragment mit dem Attribut isHidden als false. Das bedeutet, dass meine Aktivität die geladenen Fragmente durchlaufen muss und beim Start isHidden(true) auf Fragmenten wie detail_panel manuell aufruft.

Ich würde lieber den isHidden Status im XML-Layout deklarieren. Die Einstellung android:visibility="gone" in einer <fragment> Deklaration ändert jedoch nicht den isHidden Status, und ich kann keine Dokumentation zu einem anderen Attribut finden, das den Trick machen würde.

Ist es möglich, ein XML-Attribut auf einem <fragment> zu setzen, damit es ausgeblendet wird?

Hinweis: Ich bin nicht mit Sicht Sicht betroffen, ich bin mit der fragment.isHidden() Wert betroffen. Das beeinflusst, wie FragmentManager den Backstack manipuliert und Animationen ausführt. Wenn Sie transaction.show(fragment) für ein Fragment aufrufen, dessen Ansicht nicht sichtbar oder nicht vorhanden ist, aber der Wert fragment.isHidden() falsch ist, macht der FragmentManager die Sicht nicht sichtbar. Siehe http://developer.android.com/reference/android/app/Fragment.html#isHidden() als Referenz.

+0

haben Sie versucht, Android: Sichtbarkeit = "unsichtbar"? – Sushil

+0

Ja, ich habe "unsichtbar" zusätzlich zu "weg" versucht. Keine beeinflussen den isHidden-Status des Fragments. –

+0

Was meinst du mit "zusätzlich zu weg". hast du gerade versucht "unsichtbar". In diesem Fall wird das Fragment erzeugt und im unsichtbaren Zustand gehalten. – Sushil

Antwort

-1

wir haben isVisible Methode für Fragment seeting Sichtbarkeit zu Gone nimmt keinen Platz Wo als Invisble nimmt die tatsächliche Ansicht Platz.

+0

Sie beschreiben den Zustand der Ansicht, nicht den Status 'isHidden' des Fragments. –

2

Diese Antwort ist ein bisschen späte Gedanken, dass es für zukünftige Referenz hilfreich sein kann. Sichtbarkeit ist Teil der View-Klasse - Fragment erweitert Objekt, hat jedoch keinen Zugriff auf die Sichtbarkeitswerte. Eine Möglichkeit besteht darin, das Fragment zu einem Kind eines FrameLayouts zu machen und es als unsichtbar oder auf dem Layout zu bezeichnen. Dadurch wird das Fragment als verborgen angezeigt.

Hoffe es hilft!

+0

Das Ändern des Sichtbarkeitsstatus der Ansicht hat keine Auswirkungen auf den Status 'isHidden' des Fragments. –

+1

Das 'Fragment' um ein' FrameLayout' zu wickeln ist das einfachste und effektivste IMHO – noloman

0
public void showHideFrgament(final Fragment fragment){ 

    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
        ft.setCustomAnimations(android.R.animator.fade_in, 
          android.R.animator.fade_out); 

    if (fragment.isHidden()) { 
        ft.show(fragment); 
        Log.d("hidden","Show"); 
       } else { 
        ft.hide(fragment); 
        Log.d("Shown","Hide");       
       } 
       ft.commit(); 

} 
4

Ich sah eine ähnliche Situation, wo ich ein Fragment verstecken musste.

Ich habe einfach das Fragment in ein LinearLayout eingefügt und markiert das Layout sichtbar/gegangen.

<LinearLayout 
    android:id="@+id/map_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:visibility="visible" > 

    <fragment 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.google.android.gms.maps.MapFragment" /> 
</LinearLayout> 
3

Jyo der Post Basiert weg, verwenden Sie diese:

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 
    fragmentTransaction.hide(mFragment); 
    fragmentTransaction.commit(); 

Das ist für mich auf API-Ebene 23. 'mFragment' ist das Fragment, das Sie ausblenden möchten gearbeitet hat.

Verwandte Themen