是否有可能在"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的数据填充回"用户列表片段"?
如果有,怎么做?

是否有可能在"FragmentManager.PopBackStack()"被称为

您应该能够将Action传递给FilterFragment

OnDestroyView()被调用时,您可以调用Action并发回数据。


<

第一个片段/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的方法似乎也很方便。两个都可以,我不知道哪个更好。