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

时间:2018-06-22 09:34:12

标签: java android android-fragments android-intent fragmentpageradapter

我有一个带有两个片段的MainActivity。片段1是 MapsFragment ,片段2是 ListFragment 。当我启动应用程序时,我从Fragment 1获取用户位置(纬度和经度)。我还想做的是将数据传递给Fragment 2,在开始加载之前,在Fragment 2中调用onCreateView之前,因此我可以处理从片段1接收到的经纬度。

通常,我会使用意图将数据从一个片段发送到另一个片段,然后通过活动将其发送出去,但是我的问题更加具体,因为在我有时间传递数据之前,片段2紧接在片段1之后加载。

我尝试过的一些内容包括:thisthisthisthisthisthis,{{ 3}},this

我的MainActivity:

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中获得lat和lon后将其传递给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不为空时,才调用method。当我得到lat和lon后,它又被调用了,我在使用接口和一个监听器。

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

2 个答案:

答案 0 :(得分:1)

创建一个接口,您的活动将实现该接口,并在获取经度和纬度值后从MapsFragment调用该接口。 在ListFragment上,使用方法 setUserVisibleHint 。从活动中获得价值。

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

答案 1 :(得分:1)

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

无论如何,我脑海中有两种解决方案。

1-仅当用户可以看到片段2时,才将数据加载到片段2中。为此,您可以在片段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中的数据。