2016-08-17 210 views
0

我正在開發一個應用程序Xamarin.Android其中我有一個活動包括frame顯示不同的片段。 活動僅包含導航項目。整個內容顯示在不同的片段中。
其中一個片段顯示用戶列表。我想爲此列表提供過濾器。所以我創建了一個新的片段,其中包含所有過濾器選項和一個應該應用前一個「User-List-Fragment」上的所有過濾器的按鈕。
我通過添加frame到我的「用戶列表的片段」顯示「過濾器」片段和「過濾器」片段裝載到其中:當調用「FragmentManager.PopBackStack()」時,是否可以將數據返回到前一個片段?

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

要應用濾波器我打電話

FragmentManager.PopBackStack(); 

在「應用過濾器按鈕」的「單擊事件監聽器」中,再次顯示「用戶列表片段」。但是在這裏它突然結束了,因爲我不知道是否或如何將過濾器數據填充到我的「User-List-Fragment」中。

這是「User-List-Fragment」的.axml佈局的一部分。 <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

您應該可以將Action傳遞給您的FilterFragment

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的方法似乎也非常方便。兩者都有效,我不知道哪一個更好。

相關問題