【问题标题】:Refresh tab from another tab从另一个选项卡刷新选项卡
【发布时间】:2018-10-09 08:14:59
【问题描述】:

我有一个 Activity,其中包含一个 ViewPager 和四个选项卡。 每个选项卡都有一个片段。

当我单击选项卡 4 中的某些内容时,我希望选项卡 3 刷新(或访问选项卡 3 中的非静态方法)..我已经搜索过,但我发现的都是这个:

FragmentB fragment = (FragmentB)getFragmentManager().findFragmentByTag("FragmentB");

我不能使用它,因为我从未在片段上设置标签。

我也可以从另一个片段中的片段调用一个函数,但它必须是静态的,我不希望这样,因为它里面的所有东西也必须是静态的,这会给我带来麻烦..

有解决办法吗?

【问题讨论】:

  • 看看 greenrobot 的 EventBus github.com/greenrobot/EventBus。它使片段/活动之间的通信更容易。
  • EventBus 是最好的解决方案,但您也可以使用接口这个更好的选择。
  • 您通常不希望在您的片段之间进行直接通信,因为这会使它们相互依赖。相反,您通常会在 Activity 中实现一个接口并从 Tab4Fragment 调用它,然后 Activity 将执行 Tab3Fragment 的更新。从这里开始阅读developer.android.com/training/basics/fragments/communicating
  • 谢谢大家!我使用了 EventBus,我的天哪,这是一个多么简单的好工具!我现在很开心,祝各位程序员度过愉快的一天:)

标签: android android-viewpager android-tabs android-pageradapter


【解决方案1】:

首先,我认为更新用户目前在屏幕上看不到的视图不是一个好习惯。当用户导航到屏幕时更新您的数据要好得多。顺便说一句,这不是我们现在最关心的问题。

我不确定这是否仍然是在 ViewPager byTag 中找到 Fragments 的有效方法,但您可以像下面这样找到它们:

此方法为ViewPager 中的Fragment 生成默认Tag

@NonNull
public static String generateViewPagerFragmentTag(int viewPagerId, int position) {
    final StringBuilder tagBuilder = new StringBuilder();
    tagBuilder.append("android:switcher:");
    tagBuilder.append(viewPagerId);
    tagBuilder.append(":");
    tagBuilder.append(position);
    return tagBuilder.toString();
} 

您可以使用此标签通过findFragmentByTag 方法找到您的Fragment

同样如 cmets 中所述,您可以使用 EventBus 库来实现您想要做的事情,但要注意 ViewPager 中的 Fragment Lifecycle 状态,因为您想要交流的 Fragment 可以在 onPause 中声明可以收到您的更改。这取决于您订阅和取消订阅总线的生命周期方法。 (如果您使用的是 OttoBus,您将找不到此事件异常的订阅者。)您可以使用 interfaces 执行相同的模式。您可以创建一个接口并在您的Fragments 中实现。

对于其他解决方案,您可以在 ViewPager 中直接访问我们的片段。这是my answer 另一个问题。

最后,正如我在开头提到的,我认为您应该实施一个解决方案,当用户切换到ViewPager 的特定选项卡时更新您的数据。您可以将数据更改保存在内存缓存中,并在用户准确导航到该屏幕并准备查看数据更改时更新您的视图。您可以查看Repository pattern 以获得更复杂的解决方案。

【讨论】:

  • 感谢您的详细回答,我使用了 EventBus,它对我来说非常有用!至于你的第一点,我有一个通知选项卡,其中显示了一些关于用户操作的日志(从服务器获取),所以当我每次用户导航到它时更新屏幕.. 这需要一些时间,我认为这会很烦人给用户。但 EventBus 工作得很好,所有的变化都是为通知列表添加的一个项目,流畅而快速。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多