Почему пакет не сохраняется при создании фрагмента?

#android #android-fragments

#Android #android-фрагменты

Вопрос:

Я пытаюсь передать некоторые данные в пакет, когда создаю фрагмент, и по какой-то причине пакет имеет значение null, когда я читаю его в onCreate методе.

Класс фрагмента страны

 public class CountryFragment extends Fragment {
    public static final String EXTRA_COUNTRY_ID = "com.sitram.country_id";

    private Country mCountry;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        UUID countryID = (UUID)savedInstanceState.getSerializable(EXTRA_COUNTRY_ID);
        mCountry = CountryBank.get(getActivity()).getCountry(countryID);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.country_fragment, container, false);

        return v;
    }

    public static CountryFragment newInstance(UUID crimeID){
        Bundle args = new Bundle();
        args.putSerializable(EXTRA_COUNTRY_ID, crimeID);

        CountryFragment fragment = new CountryFragment();
        fragment.setArguments(args);

        return fragment;
    }

}
  

CountryPagerActivity, который создает фрагмент:

 public class CountryPagerActivity extends FragmentActivity {
    private ViewPager mViewPager;
    private ArrayList<Country> mCountryList;

    @Override
    protected void onCreate(Bundle savedInstances) {
        super.onCreate(savedInstances);

        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.viewPager);
        setContentView(mViewPager);

        mCountryList = CountryBank.get(this).getCountryList();

        FragmentManager fm = getSupportFragmentManager();
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {

            @Override
            public int getCount() {
                return mCountryList.size();
            }

            @Override
            public Fragment getItem(int arg0) {
                Country mCountry = mCountryList.get(arg0);
                return CountryFragment.newInstance(mCountry.getCountryId());
            }
        });

        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                Country mCountry = mCountryList.get(arg0);
                if (mCountry.getContinentName() != null){
                    setTitle(mCountry.getCountryName());
                }
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });

        UUID countryID = (UUID)getIntent().getSerializableExtra(CountryFragment.EXTRA_COUNTRY_ID);
        for (int i=0; i<mCountryList.size(); i  ) {
            if (mCountryList.get(i).getCountryId().equals(countryID)) {
                mViewPager.setCurrentItem(i);
                break;
            }
        }
    }

}
  

Ответ №1:

Вы получаете его из savedInstanceState , который используется только для фрагмента, который создается снова из-за изменения ориентации, нажатия кнопок home и т. Д.

он должен быть из пакета фрагмента

пример:

измените это:

 UUID countryID = (UUID)savedInstanceState.getSerializable(EXTRA_COUNTRY_ID);
  

Для:

 Bundle bundle = this.getArguments();
UUID countryID  = (UUID)bundle.getSerializable(EXTRA_COUNTRY_ID);
  

Комментарии:

1. @Sitram добро пожаловать :)), 1 этому сообщению и проголосуйте, если это поможет, спасибо.

2. Да, это всегда сбивало с толку и с моей стороны, когда мне это нужно. Логично, что для меня получение доступа непосредственно из пакета является логичным ходом действий.

Ответ №2:

Пакет, к которому вы пытаетесь получить доступ ( onCreate() , onCreateView() , onActivityCreated() ), заполняется при вызове onSaveInstanceState() при изменении конфигурации.

вместо этого вам нужно использовать getArguments().getSerializable(EXTRA_COUNTRY_ID) .