1

У меня есть деятельность под названием MainActivity с фрагментом внутри, называемым HomeFragment. Я хочу восстановить фрагмент после вращения экрана, однако что-то кажется отсутствующим. Я последовал ниже процесса:Вращение Android: почему фрагмент не восстановлен TAG?

  1. сохранения фрагмента с использованием getSupportFragmentManager().putFragment(...) во onSaveInstanceState
  2. пытаются восстановить фрагмент по fragmentManager.findFragmentByTag во OnCreate (после проверки того, что пакет не является нулевым)

Однако findFragmentByTag возвращает нуль.

Вот фрагменты кода внутри MainActivity:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Set up the action bar to show a dropdown list. 
     final ActionBar actionBar = getSupportActionBar(); 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
     setupNavigationSpinner(actionBar); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 

     if (savedInstanceState != null) { 

      if (fragmentManager.findFragmentByTag("frag") != null) { 
       // findFragmentByTag always return null 
       homeFragment = (HomeFragment) fragmentManager 
         .findFragmentByTag(HomeFragment.ARG_ITEM_ID); 
       contentFragment = homeFragment; 
      }else{ 
       homeFragment = new HomeFragment(); 
       switchContent(homeFragment, HomeFragment.ARG_ITEM_ID); 
      } 
     } else { 
      homeFragment = new HomeFragment(); 
      switchContent(homeFragment, HomeFragment.ARG_ITEM_ID); 
     } 

} 


@Override 
public void onSaveInstanceState(Bundle outState) { 
    getSupportFragmentManager().putFragment(outState, "frag",homeFragment); 
} 

public void switchContent(Fragment fragment, String tag) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    while (fragmentManager.popBackStackImmediate()) 
     ; 

    if (fragment != null) { 
     FragmentTransaction transaction = fragmentManager 
       .beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, tag); 
     // Only ArticlDetailFragment is added to the back stack. 
     if (!(fragment instanceof Fragment)) { 
      transaction.addToBackStack(tag); 
     } 
     transaction.commit(); 
     contentFragment = fragment; 
    } 
} 
+0

По какой-то причине у меня был такой же вопрос. –

+0

Э-э ... вы можете показать нам, что происходит в 'switchContent'. –

+0

@PaulBurke Обновлено – VSB

ответ

2

Там нет оснований называть

getSupportFragmentManager().putFragment(outState, "frag",homeFragment); 

Fragment состояние будет автоматически восстановлено. Проблема в том, что вы не называете супер своего onSaveInstanceState. Он должен просто выглядеть следующим образом:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 

Кроме того, вы настраиваете тег, как HomeFragment.ARG_ITEM_ID затем ищет "frag". HomeFragment.ARG_ITEM_ID == "frag"?

+0

Я просто сменил ключи на «FRAG», чтобы проверить вероятные ошибки, однако главная проблема, как вы заметили, заключалась в вызове 'super.onSaveInstanceState (outState);' – VSB

+0

@VSB Great. :-) Пожалуйста, не забудьте принять этот ответ, если он решит вашу проблему. –