2014-04-30 13 views
5

Parçalarla çalışıyorum ve arka parçadaki yeni parçaları itiyorum ancak cihazı iki kez döndürdüğümde parçanın onCreateView, ve benzeri parçanın yaşam döngüsü yöntemleri boş bir ekran. Bu sadece arka tarafa bir parça eklendiğinde veya arka taraftaki ilk fragmana geri döndüğünde gerçekleşir. etkinlik içinParça onCreateView ve onActivityCreated döndürme çağrılmadı

@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); 
} 

Bildirim:: En CollectionListFragment Kanunu'nda

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

Bu ders size yardımcı olabilir: http://stackoverflow.com/questions/8474104/android-fragment-lifecycle-over-orientation-changes Bazı güzel açıklayıcı cevapları var – shkschneider

+0

Etkinliğimin onCreate yöntemimi kullanarak bunu dikkate alıyorum . – Ge3ng

+1

Manifest'teki Aktiviteniz için bir "configChanges" öğeniz yok mu? Bu, Aktivitenin döndürüldüğünde yeniden oluşturulmasını engeller. – NasaGeek

cevap

1

, çağrı ekleyin İşte

@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; 
} 

benim CollectionListFragment Kodu: İşte

benim etkinliğin parçası işleme yöntemleri olduğunu argüman olarak true ile onCreate() yönteminde setRetainInstance() yöntemini ayarlamak için nt: setRetainInstance (doğru) kullanarak

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

} 

yapılandırma değişiklikleri meydana geldiğinde aktivite öldürülecek ama android o barındıran fragman yok etmeyecek sağlar. Bunun yerine android, parça durumunu kaydedecek ve parçayı etkinlikten ayıracaktır. Ayrıca, parçayı yok etmeyecek ve bu nedenle, daha sonra barındırma etkinliği oluşturulduğunda oluşturmayacaktır. Dolayısıyla, parça onDestroy() ve onCreate() yöntemlerine çağrı alamaz.

+0

Bu fotoğraf hakkında (fragmnet lificycle) - https://www.safaribooksonline.com/library/view/android-programming-the/9780132869126/ciUIFragments/fragment_lifecycle.png - tüm anılarınız ilgisiz –

İlgili konular