我有一个带有两个片段的MainActivity。片段1是 MapsFragment ,片段2是 ListFragment 。当我启动应用程序时,我从Fragment 1获取用户位置(纬度和经度)。我还想做的是将数据传递给Fragment 2,在开始加载之前,在Fragment 2中调用onCreateView之前,因此我可以处理从片段1接收到的经纬度。
通常,我会使用意图将数据从一个片段发送到另一个片段,然后通过活动将其发送出去,但是我的问题更加具体,因为在我有时间传递数据之前,片段2紧接在片段1之后加载。
我尝试过的一些内容包括:this,this,this,this,this,this,{{ 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后,它又被调用了,我在使用接口和一个监听器。
更好的解决方案是按照注释中的建议重写我的代码并正确编写。
答案 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中的数据。