java - 仅在 fragment 1 完成加载后调用 fragment 2 并将数据传递给它

标签 java android android-fragments android-intent fragmentpageradapter

我有一个包含两个 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/

相关文章:

Java ASCII 字符作为字符串输入

java - 当无事可做时,java中没有更新?这也许是一个错误?

java - 如何使用 REFLECTION 或任何其他 API 初始化最终类中的私有(private)变量?

java - 如何强制用户输入带有符号的密码?

android - 带有 UI 和内存泄漏的保留 fragment

java - 使用 gradle 将 jar 包含到集成测试中

java - android java.lang.UnsatisfiedLinkError

找不到用于 native react 的 Android SDK

android - 当我切换到飞行模式时,如何立即禁用我的完成按钮?

java - fragment 替换不起作用