在VIewPager(Android)中的两个片段之间传递数据(NullPointerException)

所以基本上我有2个片段 – FragmentConverterFragmentFavourites ,我有一个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 ,尽管Log.d语句会返回正确的结果。

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; } 

编辑:

当您调用fragmentPagerAdapter.getItem(1)您将获得该片段的新实例,因此您指的是另一个对象。 这就是视图为null并且您获得NullPointerException的原因。 如果你只需要一个2个片段的适配器,你可以试试这样的东西:

 public class YourPagerAdapter extends android.support.v4.app.FragmentPagerAdapter { private FragmentFavourites mFragFavourites; private FragmentConverter mFragConverter; public YourPagerAdapter() { // ... your code above this.mFragFavourites = new FragmentFavourites(); this.mFragConverter = new FragmentConverter(); } @Override public Fragment getItem(int position) { switch (position) { case 0: return mFragFavourites; case 1: return mFragConverter; default: return null; } } } 

如上所述carlo.marinangeli建议您在调用fragmentPagerAdapter.getItem(1)时获取片段的新实例,以便引用其他对象

因此,要从适配器获取相同的对象,您需要存储对象。 您可以在适配器中尝试以下方法 –

 public Fragment getFragmentAtPosition(int position) { return registeredFragments.get(position); } 

其中registeredFragments是 –

 private SparseArray registeredFragments = new SparseArray(); 

并在getItem方法中填充此sparseArray,如下所示 –

 @Override public Fragment getItem(int position) { switch (position) { case 0: fragment = FragmentPost.newInstance(position); registeredFragments.put(position, fragment); return fragment; } return null; } 

通过使用fragmentPagerAdapter.getItem(pos)方法,每次调用respond()方法时我都会引用一个新对象。 我通过使用findFragmentByTag()方法修复它:

  @Override public void respond(String[] names, String[] codes, String[] symbols, int[] images) { FragmentManager manager = getSupportFragmentManager(); FragmentConverter frag = (FragmentConverter) manager.findFragmentByTag("android:switcher:" + pager.getId() + ":" + 1); frag.changeData(names, codes, symbols, images); } 

您可以得到该错误,因为您假设您已经获得了FragmentConverter以及与之关联的视图。

如果没有logcat,对你来说有点困难,但基本上我想在这种情况下做的就是通过活动传递一切,而不知道片段中是否存在其他片段。

  • F1将状态对象修改为活动
  • F2必须注册为活动的监听器(请注意,可以在视图寻呼机中附加和分离片段)
  • 活动收到更新后立即查找所有已注册的侦听器,如果有人提供更新的更新