Bundle передается во фрагмент имеет значение null?

Я работаю над макетом вкладки с несколькими фрагментами, которые должны иметь объект, переданный им из предыдущего действия, чтобы они могли заполнить свои списки, и я сталкиваюсь с ошибкой, когда я пытаюсь получить этот объект из пакета. Ранее я передавал этот же объект между другими действиями без проблем. Я сделал объект разборчивым, поэтому я могу добавить его в пакет и передать его в качестве аргумента. Вот код для класса адаптера, который выплевывает фрагменты, используемые в макете вкладки:

package edu.uml.android.adventurersarchive;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import edu.uml.android.adventurersarchive.character.CharacterInfo;

public class SpellbookTabAdapter extends FragmentPagerAdapter {
    private Context mContext;
    private CharacterInfo myCharacter;

    public SpellbookTabAdapter(Context context, CharacterInfo ch, FragmentManager fm) {
        super(fm);
        mContext = context;
        myCharacter = ch;
    }

    @Override
    public Fragment getItem(int position) {
        Bundle bundle = new Bundle();
        if(position == 0) {
            PreparedSpellsFragment prepared = new PreparedSpellsFragment();
            bundle.putParcelable("character", myCharacter);
            prepared.setArguments(bundle);
            return prepared;
        } else if(position == 1) {
            MySpellbookFragment myspellbook = new MySpellbookFragment();
            bundle.putParcelable("character", myCharacter);
            myspellbook.setArguments(bundle);
            return myspellbook;
        } else if(position == 2) return new FullSpellbookFragment();
        else return null;
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if(position == 0) return "Prepared";
        else if(position == 1) return "My Spells";
        else if(position == 2) return "All Spells";
        else return "";
    }
}

Вот класс PreparedSpellsFragment. Код почти идентичен в классе MySpellbookFragment (за исключением того, как фрагмент взаимодействует с объектом):

package edu.uml.android.adventurersarchive;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;

import java.util.List;
import java.util.Map;

import edu.uml.android.adventurersarchive.character.CharacterInfo;
import edu.uml.android.adventurersarchive.info.Spell;

public class PreparedSpellsFragment extends Fragment {
    private SpellListAdapter adapter;
    private List<String> groupHeaders;
    private Map<String, List<Spell>> groupItems;

    public PreparedSpellsFragment() {
        Bundle bundle = getArguments();
        CharacterInfo myCharacter = (CharacterInfo) bundle.getParcelable("character");
        prepareGroups(myCharacter);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.spell_list, container, false);

        adapter = new SpellListAdapter(groupHeaders, groupItems);
        ExpandableListView expView = (ExpandableListView) rootView.findViewById(R.id.spell_list);
        expView.setAdapter(adapter);

        expView.setOnChildClickListener(new OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                // TODO: Launch activity to show detailed information about the spell.
                return false;
            }
        });

        return rootView;
    }

    private void prepareGroups(CharacterInfo myCharacter) {
        // TODO: Take spells in player's prepared list and populate the groups and their items.
        if(myCharacter != null) {

        }
    }
}

Я получаю ошибку, говорящую, что в конструкторе PreparedSpellsFragment я вызываю метод «getParcelable()» в ссылке на объект null, предполагая, что объект Bundle, полученный из «getArguments ()», равен null, но я не вижу никакой причины для того, чтобы сам пакет был null, кроме, возможно, исключения OutOfMemoryException, где он не мог выделить пространство для объекта. Я мог понять, если, возможно, объект просто не был передан правильно или если была опечатка в строке для ключа, представляющего объект, но нет… он говорит, что сам объект Bundle равен null.

Кто-нибудь может выяснить, в чем причина?

2 ответа

  1. Bundle bundle = getArguments();
    CharacterInfo myCharacter = (CharacterInfo) bundle.getParcelable("character");
    prepareGroups(myCharacter);
    

    Напишите этот код в onCreateView () и проверьте.

  2. Вы проверяете пакет в конструкторе. Избавьтесь от конструкторов и проверьте пакет в onCreateView()фрагменте вместо этого.