我正在尝试执行时收到错误(尝试在空对象引用上调用虚方法)
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
f.displayReceivedDataLanLon(message);
这是整个班级的样子
public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage, FragmentOne.SendMessageLanLon {
TabLayout tabLayout;
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
@Override
public void sendData(String message) {
String tag = "android:switcher:" + R.id.viewPager + ":" + 1;
FragmentTwo f = (FragmentTwo) getSupportFragmentManager().findFragmentByTag(tag);
f.displayReceivedData(message);
}
@Override
public void sendDataLatLon(String message) {
String tag = "android:switcher:" + R.id.viewPager + ":" + 2;
FragmentThree f = (FragmentThree) getSupportFragmentManager().findFragmentByTag(tag);
f.displayReceivedDataLanLon(message);
}
}
这是ViewPagerAdapter
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if (position == 0) {
fragment = new FragmentOne();
} else if (position == 1) {
fragment = new FragmentTwo();
} else if (position == 2) {
fragment = new FragmentThree();
}
return fragment;
}
@Override
public int getCount() {
return 3;
}
片段管理器的某个人找不到我的片段,这可能意味着它尚未附加。但我不知道我怎么能做到这一点,或者这是肯定的问题。
使用
viewPager.setOffscreenPageLimit(2);
这种方法可以解决您的问题。但我建议你尝试扩展FragmentStatePagerAdapter
而不是FragmentPagerAdapter
。它将保留您的寻呼机状态。
更新我的测试:我在onCreate()方法中放了一些代码,一切正常:
viewPager.setOffscreenPageLimit(2);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
sendData("test message");
sendDataLatLon("test message");
}
}, 3000);
当Fragment尚未创建时,可能会调用两个方法sendData
和sendDataLatLon
,尝试检查它。