Фрагмент как синглтон в 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;
}

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

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


person Daniel L.    schedule 12.02.2013    source источник
comment
что такое частный статический экземпляр?? Я считаю, что это ошибка, хе-хе. У меня все работает нормально   -  person Sheychan    schedule 04.08.2015


Ответы (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
    }
}
person hwrdprkns    schedule 12.02.2013
comment
Я изначально хотел сделать это, потому что мои фрагменты всегда видны, и я поддерживаю только портретную ориентацию. - person Daniel L.; 12.02.2013
comment
Тем не менее я не могу понять, почему, когда я закрываю и перезапускаю его, он действует по-другому. Сохраняются ли фрагменты, когда мое приложение закрыто? - person Daniel L.; 12.02.2013
comment
Фрагменты можно сохранить, когда ваша деятельность закрыта, но их также можно восстановить, если системе требуется память. Фрагменты не всегда существуют постоянно. - person hwrdprkns; 12.02.2013
comment
Спасибо, так что, если я правильно понял, мне лучше просто использовать обычный View Pager с моими пользовательскими представлениями вместо фрагментов? - person Daniel L.; 13.02.2013
comment
Нет, вам лучше использовать Фрагменты. ViewPager будет восстановлен таким же образом. Фрагменты более надежны, вроде ViewController'ов. - person hwrdprkns; 13.02.2013
comment
@hwrdprkns Что делать, если мне нужен доступ к переменным экземпляра в YourFragment? Как бы вы использовали геттеры и сеттеры в этой ситуации? - person IgorGanapolsky; 11.09.2014
comment
Хотя я согласен с @hwrdprkns в том, что фрагменты являются повторно используемыми компонентами, в большинстве случаев при использовании PagerAdapters и его реализаций, таких как FragmentPagerAdapeter, можно использовать синглтон для фрагментов, потому что getItem создаст новый экземпляр в configChange. Пожалуйста, поправьте меня, если я ошибаюсь, я не вижу много реализаций фрагментов в случае, когда разработчики используют синглтоны, но из нескольких решений, которые я видел на SO, фрагменты не используются повторно, как при обычном использовании фрагментов. - person DoubleK; 02.12.2015