仅在片段 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 中的数据。
我有一个包含两个片段的 MainActivity。片段 1 是 MapsFragment,片段 2 是 ListFragment。当我启动应用程序时,我从片段 1 获取用户位置(纬度和经度)。我还想做的是将该数据传递给片段 2, 在它开始加载之前,在片段 2 中调用 onCreateView 之前,所以我可以用从片段 1 收到的纬度和经度做一些事情。
通常我会使用意图将数据从一个片段发送到另一个片段并通过 activity 发送它,但我的问题有点具体,因为片段 2 是在片段 1 之后加载的,在我得到时间之前传递数据。
我尝试过的一些东西包括:
我的主要活动:
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 中的数据。