我有一个包含两个 fragment 的 MainActivity。 fragment 1 是 MapsFragment, fragment 2 是 ListFragment。当我启动应用程序时,我从 fragment 1 获取用户位置(纬度和经度)。我还想将该数据传递给 fragment 2,在它开始加载之前,在 fragment 2 中调用 onCreateView 之前,所以我可以用从 fragment 1 收到的经纬度做一些事情。
通常我会使用 Intent 将数据从一个 fragment 发送到另一个 fragment 并通过 Activity 发送它,但我的问题更具体一些,因为 fragment 2 是在 fragment 1 之后加载的,在我有时间传递数据之前。
我尝试过的一些东西包括:this , this , this , this , this , this , this , this
我的主要 Activity :
tabLayout = findViewById(R.id.sliding_tabs);
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_one)));
tabLayout.addTab(tabLayout.newTab().setText(getString(R.string.tab_two)));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_FIXED);
viewPager = findViewById(R.id.viewpager);
adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
viewPager.setOffscreenPageLimit(2);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
// Step 2 - undo expand for collapsible toolbar
appBarLayout.setExpanded(true);
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
我的 PagerAdapter:
public class PagerAdapter extends FragmentStatePagerAdapter {
private int mNumOfTabs;
public PagerAdapter(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MapsFragment();
case 1:
return new ListFragment();
case 2:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
现在,在我的 MapsFragment 中获取纬度和经度后,这是我将其传递给 MainActivity 的方式:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
Intent intent = new Intent(getActivity().getBaseContext(),
MainActivity.class);
intent.putExtra("latitude", latitude);
intent.putExtra("longitude", longitude);
getActivity().startActivity(intent);
...
}
解决方案:
它基于答案和评论。在我的列表 fragment 中,只有当 lat 和 lon 不为空时,我才调用方法。在我得到纬度和经度之后,它再次被调用,我正在使用接口(interface)和一个监听器。
更好的解决方案是重写我的代码并按照评论中的建议正确编写。
最佳答案
最好的方法是在Activity中获取两个 fragment 都使用的公共(public)数据,然后添加 fragment 。
无论如何,对于您的问题,我有两个解决方案。
1- 仅当 fragment 2 对用户可见时才在 fragment 2 中加载数据。为此,您可以在 Fragment 2 中覆盖此方法。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
//load data here
}
}
2- 最初用一些虚拟数据填充 fragment 2(或留空),并在 fragment 1 通过从 fragment 1 向 fragment 2 发送广播事件完成加载数据时更新 fragment 2 中的数据。
关于java - 仅在 fragment 1 完成加载后调用 fragment 2 并将数据传递给它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50984993/