【问题标题】:Is it possible to return data to the previous fragment when "FragmentManager.PopBackStack()" is called?调用“FragmentManager.PopBackStack()”时是否可以将数据返回到前一个片段?
【发布时间】:2016-08-17 13:48:09
【问题描述】:

我正在使用 Xamarin.Android 开发一个应用程序,其中我有一个 root 活动,其中包括一个用于显示不同片段的 frameroot 活动只包含导航项。整个内容显示在不同的片段中。
其中一个片段是显示用户列表。我想为此列表提供一个过滤器。因此,我创建了一个新片段,其中包含所有过滤器选项和一个按钮,该按钮应在之前的“用户列表片段”上应用所有过滤器。
我通过将frame 添加到我的“用户列表片段”中来显示“过滤器”片段并将“过滤器”片段加载到其中:

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

应用我调用的过滤器

FragmentManager.PopBackStack();

在“应用过滤器按钮”的“点击事件监听器”中,再次显示“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 填充回“用户列表片段”?
如果有,怎么做?

【问题讨论】:

    标签: c# android-fragments xamarin xamarin.android


    【解决方案1】:

    您应该能够将Action 传递给您的FilterFragment

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


    示例

    第一个片段

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

    过滤器片段

    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.
    }
    

    【讨论】:

    • 这种方法看起来很棒。我仍处于成为 C# 开发人员的最开始,所以我不知道 Action&lt;T&gt; 代表。我在此期间所做的是,编写一个包含过滤器对象的 EventHandler,并在 OnDestroy() 方法中触发此事件。似乎与您的方法类似。但是你的也有效,所以我会给你接受。谢谢
    【解决方案2】:

    在按下FilterFragment 中的“应用过滤器按钮”后,我通过使用自定义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 的方法似乎也很方便。两者都可以,我不知道哪个更好。

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      相关资源
      最近更新 更多