java在VIewPager(Android)中的两个片段之间传递数据(NullPointerException)
所以基本上我有2片段-FragmentConverter
和FragmentFavourites
,我有一个MainActivity
。我试图使用一个名为Communicator
的接口将4个数组从第一个片段传递到第二个片段。具体代码段如下所示:
public interface Communicator {
public void respond(String[] names, String[] codes, String[] symbols, int[] images);
}
这是FragmentFavourites
中的一个方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
String[] checkedNames = new String[counter];
String[] checkedCodes = new String[counter];
String[] checkedSymbols = new String[counter];
int[] checkedImages = new int[counter];
comm = (Communicator) getActivity();
int index = 0;
if (item.getItemId() == R.id.action_save){
for (int i=0;i<checked.size();i++){
if (checked.get(i) == true){
checkedNames[index] = names[i];
checkedCodes[index] = codes[i];
checkedSymbols[index] = symbols[i];
checkedImages[index] = images[i];
index++;
}
}
comm.respond(checkedNames, checkedCodes, checkedSymbols, checkedImages);
}
return super.onOptionsItemSelected(item);
}
这是MainActivity
中实现的接口方法:
@Override
public void respond(String[] names, String[] codes, String[] symbols,
int[] images) {
// TODO Auto-generated method stub
FragmentConverter frag = (FragmentConverter) fragmentPagerAdapter.getItem(1);
frag.changeData(names, codes, symbols, images);
}
这是一种在FragmentConverter
中收集数据的方法:
public void changeData(String[] names, String[] codes, String[] symbols, int[] images){
this.names = names;
this.codes = codes;
this.symbols = symbols;
this.images = images;
Log.d("TEST", symbols.length + names.length + codes.length + images.length + "");
tvOneRate.setText(names[1]);
}
现在的问题是,每当我试图更改FragmentConverter
内的ui组件时,我都会通过日志得到一个NullPointerException
。语句返回正确的结果强>
EDIT1:FragmentPagerAdapter的getItem()方法:
@Override
public Fragment getItem(int i) {
// TODO Auto-generated method stub
Fragment frag = null;
if (i == 0){
frag = new FragmentFavourites();
}
if (i == 1){
frag = new FragmentConverter();
}
return frag;
}
# 1 楼答案
编辑:
当您调用
fragmentPagerAdapter.getItem(1)
时,您将获得片段的一个新实例,因此您引用的是另一个对象。这就是为什么视图为null,而您得到的是NullPointerException。如果只需要2个片段的适配器,可以尝试以下方法:# 2 楼答案
如上所述,卡洛。marinangeli建议你叫fragmentPagerAdapter。getItem(1)您将获得片段的一个新实例,因此您引用的是另一个对象
所以,要从适配器获得相同的对象,需要存储对象。您可以在适配器中尝试以下方法-
凡注册碎片是—
并在getItem方法中填充此sparseArray,如下所示-
# 3 楼答案
您可能会得到该错误,因为您假设您已经获得了FragmentConverter及其关联的视图
如果没有logcat,帮助您变得有点困难,但在这种情况下,基本上我想做的是通过活动传递所有信息,而不让其他片段知道它们的存在
# 4 楼答案
通过使用
fragmentPagerAdapter.getItem(pos)
方法,每次调用respond()
方法时,我都引用一个新对象。我改为使用findFragmentByTag()
方法修复了它: