#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)
.