2016-07-18 15 views
0

私はFragmentManager.FindFragmentByIdFragmentを返す必要がありますし、idはもちろんlayoutフォルダの下にXMLファイルで定義されたいくつかのFragmentする必要があります理解として、私は完全にここにhttps://developer.xamarin.com/samples/HelloTabsICSFragmentManager.FindFragmentByIdをFrameLayoutに対して使用するのはなぜですか?

でタブを使用する方法についてXamarinの例のコードの一部を理解していません。しかし、上記のリンクからコード私には奇妙な何かを持っている、ここでは1つのレイアウト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> 

と(たとえばデモでは)次のコードは、AであるID fragmentContainerからFragmentを見つけることができますFrameLayout?それは完全に私にはどんな意味がありません、ここでのコードは次のとおりです。

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

なぜFrameLayoutのidはFragmentのインスタンスを見つけるために使用することができますか?その時点では本当に混乱しています。

私はXamarin.AndroidとAndroidプログラミング(ちょうど5日間の経験がある)にかなり新しいです。その奇妙なことを説明してください。

ありがとうございました!

答えて

0

これは、FrameLayoutにプログラムで実装できるFragmentが含まれているためです。

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​​という2番目のフラグメントがあるとします。 tx.Add()を使用してコンテナに追加すると、最初のコンテナとコンテナがスタックされます。代わりに置換を使用すると、最初のものが消去されます。 しかし、同じコンテナに2つの断片があることは悪い考えです。理想的には、コンテナごとに1つのフラグメントが必要です。

あなたが本当に容器内の二つの断片を配置する必要がある場合は、あなたがこれをやってフラグメントにタグを追加することができます。

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

次に、あなたのコンテナから正確なフラグメントを見つけるために、あなたがこれを行うことができます:

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

でも、これは良い考えではありません。コンテナあたりのフラグメントが1つあります。

注:コミット直後にフラグメントをコンテナから取得しようとすると、奇妙な結果が出ました。いつもコンテナの以前の内容を私に与えていました。私はそれがこのように動作することを計画していると思いますが、呼び出されたメソッドが終了すると、コミットが実際に適用されるようです。

私は十分に明確になっていますので、詳細をお気軽にお尋ねください!

+0

'FrameLayout'は複数のフラグメントを含むことができるので、渡された' FrameLayout'のIDで 'FindFragmentById'を使うことを意味しますか?見つかった場合、最初のフラグメントを返しますか? – Hopeless

関連する問題