仅在片段 1 完成加载后调用片段 2 并将数据传递给它

Call fragment 2 and pass data to it, only after fragment 1 has finished loading

我有一个包含两个片段的 MainActivity。片段 1 是 MapsFragment,片段 2 是 ListFragment。当我启动应用程序时,我从片段 1 获取用户位置(纬度和经度)。我还想做的是将该数据传递给片段 2, 在它开始加载之前,在片段 2 中调用 onCreateView 之前,所以我可以用从片段 1 收到的纬度和经度做一些事情。

通常我会使用意图将数据从一个片段发送到另一个片段并通过 activity 发送它,但我的问题有点具体,因为片段 2 是在片段 1 之后加载的,在我得到时间之前传递数据。

我尝试过的一些东西包括:, this, this, this, this, this, this,this

我的主要活动:

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

解法:
它基于答案和评论。在我的列表片段中,只有当 lat 和 lon 不为空时,我才调用方法。在我得到纬度和经度之后,它再次被调用,我正在使用接口和一个监听器。

更好的解决方案是重写我的代码并按照评论中的建议正确编写。

创建一个您的 activity 将实现的接口,一旦您获得值 Longitude 和 Latitude,就从您的 MapsFragment 调用该接口。 在 ListFragment 上使用方法 setUserVisibleHint。从 activity 中获取值。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
     ////Use the longitude and latitude values. 
    }

最好的方法是在Activity中获取两个片段都使用的公共数据,然后添加片段。

无论如何,对于你的问题,我有两个解决方案。

1- 仅当片段 2 对用户可见时才在片段 2 中加载数据。为此,您可以在 Fragment 2 中覆盖此方法。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
         //load data here
    }  
}

2- 最初用一些虚拟数据填充片段 2(或留空),并在片段 1 通过从片段 1 向片段 2 发送广播事件完成加载数据时更新片段 2 中的数据。