在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
,尽管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必须注册为活动的监听器(请注意,可以在视图寻呼机中附加和分离片段)
- 活动收到更新后立即查找所有已注册的侦听器,如果有人提供更新的更新