2014-04-30 16 views
5

Pracuję z fragmentami i przesuwaniem nowych fragmentów na backstackach, ale kiedy obracam urządzenie dwukrotnie w stosunku do fragmentu o onCreateView, onActivityCreated itd. W cyklu fragmentu metody nigdy nie są nazywane odejściem pusty ekran. Dzieje się tak tylko wtedy, gdy fragment został dodany do backstack lub powrócił do pierwszego fragmentu w backstack.Fragment onCreateView i onActivityCreated nie są wywoływane przy obrocie

Oto metody manipulacyjne fragment mojej działalności jest:

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

    // Injection 
    MormonChannel.injectActivity(this); 

    setDrawerIndicatorEnabled(true); 

    // Do not set currentNavigationItem here. 
    NavigationItemSelectedEvent.NavigationItem navItem = null; 
    Intent intent = getIntent(); 
    if (intent != null) { 
     navItem = (NavigationItemSelectedEvent.NavigationItem) 
     intent.getSerializableExtra(EXTRA_NAV_ITEM); 
    } 

    if (savedInstanceState == null) { 
     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction().replace(R.id.container, new FeatureListFragment()).commit(); 
     if (navItem != null) { 
      onNavigationItemSelected(new NavigationItemSelectedEvent(navItem)); 
     } else { 
      currentNavigationItem = NavigationItemSelectedEvent.NavigationItem.FEATURES; 
     } 
    } 

} 

@Subscribe 
public void onNavigationItemSelected(NavigationItemSelectedEvent event) { 

    if (currentNavigationItem == event.getNavigationItem()) { 
     return; 
    } 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.popBackStack(); 
    NavigationItemSelectedEvent.NavigationItem navigationItem = event.getNavigationItem(); 
    String name = navigationItem.getName(); 
    switch (navigationItem) { 
     default: 
     case FEATURES: 
      // Nothing needs to be done it is already there. 
      break; 
     case AUDIO: 
      fragmentManager.beginTransaction().replace(R.id.container, 
        CollectionListFragment.newInstance(prefs.getLanguageId(), prefs.getAudioCollectionId())) 
        .addToBackStack 
          (name).commit(); 
      break; 
     case VIDEO: 
      fragmentManager.beginTransaction().replace(R.id.container, 
        CollectionListFragment.newInstance(prefs.getLanguageId(), prefs.getVideoCollectionId())) 
        .addToBackStack(name).commit(); 
      break; 
     case RADIO: 
      fragmentManager.beginTransaction().replace(R.id.container, 
        CollectionListFragment.newInstance(prefs.getLanguageId(), prefs.getRadioCollectionId())) 
        .addToBackStack(name).commit(); 
      break; 
     case HISTORY: 
      fragmentManager.beginTransaction().replace(R.id.container, new HistoryFragment()).addToBackStack(name).commit(); 
      break; 
     case DOWNLOADS: 
      fragmentManager.beginTransaction().replace(R.id.container, new DownloadsFragment()).addToBackStack(name).commit(); 
      break; 
     case PLAYLISTS: 
      fragmentManager.beginTransaction().replace(R.id.container, new PlaylistFragment()).addToBackStack(name).commit(); 
      break; 
    } 
    currentNavigationItem = navigationItem; 
} 

Oto mój kod CollectionListFragment:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MormonChannel.injectFragment(this); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.collection_list_fragment, container, false); 
    ButterKnife.inject(this, v); 
    return v; 
} 

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

    listView.setDividerHeight(0); 
    listView.setFastScrollEnabled(true); 


    Bundle args = getArguments(); 
    if (args != null) { 
     languageId = args.getLong(ARG_LANGUAGE_ID, -1L); 
     collectionId = args.getLong(ARG_COLLECTION_ID, -1L); 
     if (args.containsKey(ARG_SORT)) { 
      sort = (Sort) args.getSerializable(ARG_SORT); 
     } 
    } 

    if (collectionId == -1L || languageId == -1L) { 
     // TODO Implement Empty Collection Text 
    } else { 
     collection = collectionManager.findByCollectionId(languageId, collectionId); 
     getLoaderManager().initLoader(LOADER_ID, null, this); 
    } 

    titleEvent = new TitleChangeEvent(collection != null ? collection.getTitle() : getString(R.string.app_name)); 
    bus.post(titleEvent); 
} 

Oczywisty aktywności:

<activity 
    android:name=".activity.MainActivity" 
    android:launchMode="singleTask"> 
    <meta-data 
     android:name="android.app.default_searchable" 
     android:value=".activity.SearchActivity"/> 
</activity> 
+0

Wykład ten może pomóc: http://stackoverflow.com/questions/8474104/android-fragment-lifecycle-over-orientation-changes ma kilka fajnych odpowiedzi wyjaśniających – shkschneider

+0

Biorę to pod uwagę za pomocą mojej metody onCreate . – Ge3ng

+1

Nie masz elementu "configChanges" dla swojej Aktywności w swoim Manifeście? To uniemożliwiłoby ponowne odtworzenie działania na rotacie. – NasaGeek

Odpowiedz

1

w kodzie CollectionListFragment, dodać połączenia do metody setRetainInstance() w metodzie onCreate(), z wartością true jako argume nt:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    MormonChannel.injectFragment(this); 

} 

Korzystanie setRetainInstance (true) gwarantuje, że w razie wystąpienia zmian konfiguracyjnych aktywność będzie zabity, ale android nie zniszczy fragment jest hosting.

Zamiast tego android zapisze stan fragmentu i odłączy fragment z działania. Nie zniszczy też fragmentu, więc nie będzie go tworzyć później, gdy zostanie utworzona aktywność hostingu. Fragment nie będzie więc odbierać wywołań metod onDestroy() i onCreate().

+0

Co z tym zdjęciem (fragmnet lificycle) - https://www.safaribooksonline.com/library/view/android-programming-the/9780132869126/ciUIFragments/fragment_lifecycle.png - to sprawia, że ​​cały twój inweeks –

Powiązane problemy