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

Man*_*jaj 2 java android nullpointerexception android-fragments android-viewpager

所以基本上我有两个碎片 - FragmentConverter而且FragmentFavourites,我有一个MainActivity.我正在尝试使用名为的接口将第一个片段中的4个数组传递给第二个数组Communicator.具体片段如下所示:

public interface Communicator {

    public void respond(String[] names, String[] codes, String[] symbols, int[] images);
}
Run Code Online (Sandbox Code Playgroud)

这是一个方法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);
    }
Run Code Online (Sandbox Code Playgroud)

这是内部实现的接口方法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);
}
Run Code Online (Sandbox Code Playgroud)

这是一种收集数据的方法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]); 
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,每当我尝试更改内部的ui组件时FragmentConverter,我会得到一个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;
    }
Run Code Online (Sandbox Code Playgroud)

car*_*eli 6

编辑:

当您调用时,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;
            }    
        }
    }
Run Code Online (Sandbox Code Playgroud)