是否有可能在"FragmentManager.PopBackStack()"被称为
本文关键字:quot 被称为 PopBackStack FragmentManager 有可能 是否 | 更新日期: 2023-09-27 18:02:50
我正在开发一个应用程序与Xamarin.Android
,其中我有一个根活动,包括frame
显示不同的片段。根活动只包含导航项。整个内容在不同的片段中显示。
其中一个片段显示用户列表。我想为这个列表提供一个过滤器。所以我创建了一个新的片段,其中包含所有的过滤器选项和一个按钮,该按钮应该应用之前的"User-List-Fragment"上的所有过滤器。
我通过在"User-List-Fragment"中添加一个frame
来显示"filter"片段,并将"filter"片段加载到其中:
FragmentManager.BeginTransaction()
.AddToBackStack(null)
.Replace(Resource.Id.members_filterFrame, new FilterFragment())
.Commit();
我调用
来应用过滤器FragmentManager.PopBackStack();
在"apply filter按钮"的"click event listener"中,重新显示"User-List-Fragment"。但是这里一切都突然结束了,因为我不知道是否或者如何将过滤器数据填充回我的"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
的数据填充回"用户列表片段"?
如果有,怎么做?
您应该能够将Action
传递给FilterFragment
。
当OnDestroyView()
被调用时,您可以调用Action
并发回数据。
例子strong>
<第一个片段/em>
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.
}
我通过在FilterFragment
中按下"apply filter button"后触发一个自定义EventArgs
事件来解决这个问题:
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
之前在"User-List-Fragment"中注册事件,如下所示:
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的方法似乎也很方便。两个都可以,我不知道哪个更好。