2016-08-17 6 views
0

Xamarin.Androidのアプリを開発しています。このアプリでは、ルートアクティビティには、異なるフラグメントを表示するためのframeが含まれています。 ルートアクティビティにはナビゲーション項目のみが含まれています。内容全体が異なる断片に示されています。
フラグメントの1つがユーザーのリストを表示しています。私はこのリストのフィルタを提供したいと思います。だから私は、すべてのフィルタオプションと、以前の "User-List-Fragment"のすべてのフィルタを適用するボタンを備えた新しいフラグメントを作成しました。
私は、「ユーザーリスト・フラグメント」にframeを追加することで、「フィルタ」の断片を表示し、その中に「フィルタ」の断片を読み込む:"FragmentManager.PopBackStack()"が呼び出されたときに前のフラグメントにデータを返すことはできますか?

FragmentManager.BeginTransaction() 
    .AddToBackStack(null) 
    .Replace(Resource.Id.members_filterFrame, new FilterFragment()) 
    .Commit(); 

私は

FragmentManager.PopBackStack(); 
呼び出すフィルタを適用するには「フィルタボタンを適用」の「クリックイベントリスナ」内の「

」をクリックして、「ユーザリストフラグメント」を再度表示します。しかし、ここでは、私が "User-List-Fragment"にフィルタデータを戻すことができるのかどうか、また、どのようにそれをどのように埋めることができないのかが分からないため、すべてが突然終了します。

これは、私の.axmlの "User-List-Fragment"レイアウトの一部です。 <FrameLayout /><ListView />をオーバーレイし、ユーザーが「フィルターボタン」を押した場合にのみ表示されます。

. 
    . 
    . 
<ListView 
    android:id="@+id/members_listView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingBottom="150dp" /> 

<FrameLayout 
    android:id="@+id/members_filterFrame" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:visibility="gone" /> 
    . 
    . 
    . 

質問
FragmentManager.PopBackStack();を呼び出すときに、「ユーザー・リスト・フラグメント」にFilterFragmentバックからデータを移入することが可能ですか?
もしそうなら、どうですか?

答えて

1

ActionFilterFragmentに渡すことができます。

OnDestroyView()が呼び出されると、Actionが呼び出され、データが返されます。


最初のフラグメント

FragmentManager.BeginTransaction() 
.AddToBackStack(null) 
.Replace(Resource.Id.members_filterFrame, new FilterFragment((parameter) => { 
    // Do something with the given parameter 
})) 
.Commit(); 

FilterFragment

private Action<T> _onCompletionAction; 
public FilterFragment(Action<T> onCompletionAction) 
{ 
    _onCompletionAction = onCompletionAction; 
} 

public override void OnDestroyView() 
{ 
    base.OnResume(); 

    _onCompletionAction(parameter) // parameter could be a filter object. 
} 
+0

このアプローチは素晴らしいと思われます。私はまだC#開発者になったばかりで、 'Action 'デリゲートについては知りませんでした。私がその間にしたことは、フィルターオブジェクトを保持するEventHandlerとこのイベントを発生させる 'OnDestroy()'メソッドを書くことです。あなたと同様のアプローチのようです。しかし、あなたもうまくいくので、私はあなたに受け入れを与えます。ありがとう – croxy

1

私も焼成することによってそれを解決しましたで、「フィルタボタンを適用する」を押した後、カスタムEventArgsとトンFilterFragment

Searched?.Invoke(this, new FilterAppliedEventArgs(FilterObject)); // fire search event 
FragmentManager.PopBackStack(); 

FilterAppliedEventArgsクラスには、次のようになります。

public class FilterAppliedEventArgs : EventArgs 
{ 
    public Filter FilterObject { get; set; } 

    public FilterAppliedEventArgs(Filter filter) 
    { 
     this.FilterObject = filter; 
    } 
} 

そして、「ユーザーリストのフラグメント」のイベントの前を登録このようなFilterFragmentを表示:

var filterFragment = new FilterFragment(); 
// get the filter attributes 
filterFragment.Searched += (s, ea) => 
{ 
    var eventArgs = ea as FilterAppliedEventArgs; 
    LoadFilteredMembers(eventArgs.FilterObject); 
}; 

FragmentManager.BeginTransaction() 
    .AddToBackStack(null) 
    .Replace(Resource.Id.members_filterFrame, filterFragment) 
    .Commit(); 

@Pilatusのアプローチもとても便利です。どちらもうまくいくし、どちらが良いのかわからない。