Фрагмент как синглтон в Android - программирование
Подтвердить что ты не робот

Фрагмент как синглтон в Android

Общий вопрос Могу ли я определить фрагменты как синглтоны?

Конкретный вопрос В моем приложении у меня есть один "FragmentActivity" с FragmentPager, который имеет два фрагмента, FragmentA и FragmentB.

Я определил фрагменты как синглтоны в классе FragmentA extends Fragment:

private static instance = null;

public static FragmentA getInstance() {
    if (instance == null) {
        instance = new FragmentA();
    }   
    return instance;
}
private FragmentA() {}

и в моем FragmentPagerAdapter:

@Override
public Fragment getItem(int position) {
    switch(position){
    Fragment fragment = null;
    case 0:
        fragment = FragmentA.getInstance(); 
        break;
    case 1:
        fragment = FragmentB.getInstance(); 
        break;
    }
    return fragment;
}

и именно так я раздуваю макет фрагментов:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    fragmentView = (RelativeLayout) inflater.inflate(R.layout.fragment_a_layout, container, false);
    return fragmentView;
}

Моя проблема:

Когда я впервые запускаю свое приложение, все работает хорошо. Когда я закрываю приложение и перезапускаю его, я не вижу оба фрагмента.

4b9b3361

Ответ 1

Фрагменты предназначены для повторного использования компонентов приложений. Вы не должны использовать их как синглеты, вместо этого вы должны реализовать Fragment.SavedState или onSavedInstanceState.

public class YourFragment extends Fragment {
    // Blah blah blah you have a lot of other code in this fragment
    // but here is how to save state
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }
    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // savedInstanceState will have whatever you left in the outState bundle above
    }
}