我有一个Activity,其中包含一个带有四个选项卡的ViewPager。 每个标签都有一个片段。
当我单击选项卡4中的某些内容时,我希望选项卡3刷新(或访问选项卡3中的非静态方法)..我已经搜索过,但发现的所有内容都包含在其中:
FragmentB fragment = (FragmentB)getFragmentManager().findFragmentByTag("FragmentB");
而且我无法使用它,因为我从未在片段上设置标签。
我也可以从另一个片段的片段中调用一个函数,但是它必须是静态的,并且我不希望那样,因为其中的所有内容也必须是静态的,这会给我带来麻烦。.
有解决方案吗?
答案 0 :(得分:0)
首先,我认为更新用户当前无法在屏幕上看到的视图不是一个好习惯。当用户导航到屏幕时,最好更新您的数据。顺便说一句,这不是我们现在最关心的。
我不确定这仍然是在Fragments
byTag中找到ViewPager
的有效方法,但是您可以像下面这样找到它们:
此方法为Tag
中的Fragment
生成默认的ViewPager
。
@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();
}
比起您可以使用此标记通过Fragment
方法来找到您的findFragmentByTag
。
也如评论中所述,您可以使用EventBus
库来实现所需的操作,但是请注意Fragment Lifecycle
中的ViewPager
状态,因为您想要的Fragment
可以处于onPause
状态进行交流,可以接收您的更改。这取决于您订阅和取消订阅总线的生命周期方法。 (如果您使用的是OttoBus,则无法找到此事件异常的订阅者。)您可以使用interfaces
执行相同的模式。您可以在Fragments
中创建一个接口并实施。
对于其他解决方案,您可以直接在ViewPager中访问我们的片段。这是my answer的另一个问题。
最后,正如我在开始时提到的那样,我认为您应该实现一个解决方案,当用户切换到ViewPager
的特定选项卡时更新您的数据。您可以将数据更改保存在内存缓存中,并在用户完全导航到该屏幕并准备查看数据更改时侦听选项卡更改并更新视图。您可以检查Repository pattern
以获得更复杂的解决方案。