2016-07-18 4 views
0

Ich verstehe absolut nicht, ein Stück Code in das Xamarin Beispiel über Tab an hier mit https://developer.xamarin.com/samples/HelloTabsICSWarum konnte FragmentManager.FindFragmentById gegen FrameLayout verwendet werden?

Wie ich FragmentManager.FindFragmentById verstehen sollte eine Fragment zurückkehren sollte und die ID natürlich einige Fragment unter layout Ordner in XML-Dateien definiert . Aber der Code aus dem Link hat oben etwas seltsam für mich, hier ist ein Layout XML-Datei:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <FrameLayout 
     android:id="@+id/fragmentContainer" 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" /> 
</LinearLayout> 

und der folgende Code (im Beispiel Demo) kann fragmentContainer ein Fragment von der ID herauszufinden, welche von a FrameLayout? Das völlig keinen Sinn für mich, hier ist der Code:

var fragment = this.FragmentManager.FindFragmentById(Resource.Id.fragmentContainer); 
if (fragment != null) 
     e.FragmentTransaction.Remove(fragment); 

Warum kann die ID von FrameLayout verwendet werden, um eine Instanz von Fragment, um herauszufinden? Es ist wirklich verwirrend an diesem Punkt.

Ich bin ziemlich neu zu Xamarin.Android sowie Android-Programmierung (nur für 5 Tage erlebt). Also bitte hilf mir, diese seltsame Sache zu erklären.

Vielen Dank!

Antwort

0

Dies liegt daran, dass FrameLayout ein Fragment enthält, das Sie programmgesteuert implementieren können.

Nehmen wir an, Sie haben ein Fragment wie FirstFrag.cs, das enthält, egal welche UI-Elemente egal welchen Code. Sie können dieses Fragment in Ihrem FrameLayout instanziiert dies zu tun:

FragmentTransaction tx = FragmentManager.BeginTransaction(); 
tx.Replace (Resource.Id.fragmentContainer, new FirstFrag()); 
tx.Commit(); //Where fragmentContainer is your FrameLayout. 
//Also note that tx.Replace is acting like tx.Add if there is no fragment. 

Dann, mit FindFragmentById auf diesem FrameLayout, können Sie die FirstFrag darin als Fragment-Objekt enthalten sind, erhalten. Besser kann man es direkt als FirstFrag erhalten:

FirstFrag frag = FragmentManager.FindFragmentById<FirstFrag>(Resource.id.fragmentContainer); 

Die FrameLayout wird einfach als Container für Ihre Fragmente wirken. Sie können ein beliebiges Layout verwenden, je nachdem, wie Sie den Fragmentinhalt anzeigen möchten.

Nehmen wir an, Sie haben ein zweites Fragment namens SecondFrag.cs. Wenn Sie es mithilfe von tx.Add() zu Ihrem Container hinzufügen, wird es mit dem ersten Container gestapelt. Wenn Sie stattdessen Ersetzen verwenden, löschen Sie den ersten Eintrag. Aber es scheint eine schlechte Idee zu sein, zwei Fragmente in demselben Container zu haben. Idealerweise möchten Sie ein einzelnes Fragment pro Container haben.

Wenn Sie wirklich in einem Container zwei Fragmente müssen setzen, können Sie einen Tag mit dem Fragmente hinzufügen können, dies zu tun:

FragmentTransaction tx = FragmentManager.BeginTransaction(); 
tx.Add(Resource.id.fragmentContainer, new SecondTag(), "YourTag"); 
tx.Commit(); 

Dann ein genaues Fragment aus dem Behälter zu finden, können Sie dies tut:

var frag = FragmentManager.FindFragmentByTag("YourTag"); 

Aber wieder ist es keine gute Idee. Ein Fragment pro Container ist der Weg zu gehen.

HINWEIS: Ich hatte seltsame Ergebnisse, als ich versuchte, das Fragment unmittelbar nach dem Commit aus dem Container zu holen. Es gab mir immer den vorherigen Inhalt des Containers. Ich denke, es ist geplant, so zu arbeiten, aber es scheint, als ob das Commit wirklich angewendet wird, sobald die Methode, in der es aufgerufen wurde, vorüber ist.

Hoffe, ich war klar genug, zögern Sie nicht für weitere Details zu fragen!

+0

Ein 'FrameLayout' kann mehr als 1 Fragment enthalten, also meinst du' FindFragmentById' mit der übergebenen ID von 'FrameLayout' wird das erste Fragment (falls vorhanden) zurückgeben? – Hopeless

Verwandte Themen