从另一个选项卡刷新选项卡

Refresh tab from another tab

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

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

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

而且我无法使用它,因为我从未在片段上设置标签。

我也可以从另一个片段中的片段调用一个函数,但它必须是静态的,我不希望那样,因为它里面的所有东西也必须是静态的,这会把事情搞砸。.

有解决办法吗?

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

我不确定这是否仍然是在 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

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

中实现

对于其他解决方案,您可以直接在 ViewPager 中访问我们的片段。这里换个问题吧

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