2016-07-18 58 views
0

我完全不明白在Xamarin例如一段代碼在左右這裏使用Tab鍵https://developer.xamarin.com/samples/HelloTabsICS爲什麼FragmentManager.FindFragmentById可以用於FrameLayout?

據我瞭解FragmentManager.FindFragmentById應該返回一個Fragment和ID應該是過程中的一些Fragmentlayout文件夾下的XML文件中定義的。但上述來自鏈接代碼有給我一些奇怪的事情,這裏是一個佈局的xml文件:

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

和下面的代碼(在本例中演示)可以找出從ID fragmentContainer這是一個一FragmentFrameLayout?這完全沒有任何意義,我,這裏是代碼:

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

爲什麼的FrameLayout的ID可以用來找出Fragment一個實例?這一點真令人困惑。

我對Xamarin.Android以及Android編程(剛剛經歷了5天)頗爲陌生。所以請幫我解釋一下這件奇怪的事情。

非常感謝!

回答

0

這是因爲FrameLayout包含一個片段,您可以通過編程實現。

假設您有一個片段,如FirstFrag.cs​​,其中包含無論使用哪個UI元素執行任何代碼。你可以實例化這個片段您的FrameLayout裏面這樣做:

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. 

然後,對使用的FrameLayout FindFragmentById,你將能夠獲得包含在它作爲一個片段對象FirstFrag。更好的是,你可以直接把它作爲FirstFrag:

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

FrameLayout只是作爲你的片段的容器。您可以使用任何佈局,具體取決於您希望如何顯示片段內容。

現在讓我們假設您有第二個片段,稱爲SecondFrag.cs​​。如果使用tx.Add()將它添加到容器中,它將與第一個一起堆棧到容器中。如果您使用Replace,則會擦除第一個。 但是,在同一個容器中有兩個片段似乎是個不錯的主意。理想情況下,您希望每個容器都有一個片段。

如果你真的需要把兩個片段的容器裏面,你可以將代碼添加到片段這樣做:

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

然後,找到你的容器精確的片段,你可以這樣做:

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

但是,這不是一個好主意。每個容器一個片段是要走的路。

注:我有奇怪的結果試圖從提交後立即從容器中獲取片段。它總是給我以前的容器內容。我想它是按照這種方式計劃的,但是一旦它被調用的方法結束,它似乎就會被應用。

希望我已經足夠清楚,隨時要求更多的細節!

+0

一個'FrameLayout'可以包含多於一個片段,所以你的意思是使用帶有'FrameLayout'的id的'FindFragmentById'將返回第一個片段(如果有的話)? – Hopeless

相關問題