2014-05-18 2 views
3

J'utilise la navigation déroulante et, en raison de certains problèmes de thème, j'utilise un Spinner pour cela. J'utilise la méthode suivante pour mettre en place la actionbar:Les fragments ne sont pas conservés lors du changement d'orientation

public void setupActionBar() { 
    Spinner navSpinner = new Spinner(new ContextThemeWrapper(this, R.style.Theme_Apptheme_Widget_ActionBarSpinner)); 
    navSpinner.setSelection(getSharedPreferences(APP_NAME, MODE_PRIVATE).getInt(SELECTED_POSITION, 0)); 
    Log.d(getClass().getName(), navSpinner.getSelectedItemPosition() + ""); 
    navSpinner.setAdapter(new ActionBarSpinnerAdapter(getActionBar().getThemedContext(), dataSource.getAllShoppingLists())); 
    navSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      if (position < dataSource.getAllShoppingLists().size()) { 
       if(fragmentManager.findFragmentByTag("shoppinglist" + position) == null) { 
        ShoppingListFragment shoppingListFragment = ShoppingListFragment. 
          newInstance(dataSource.getShoppingListForPosition(position).getId()); 
        fragmentTransaction.replace(R.id.container, shoppingListFragment, "shoppinglist" + position); 
        } 
      } else if (position == dataSource.getAllShoppingLists().size()) { 
       if(fragmentManager.findFragmentByTag("shoppinglistmanager") == null) { 
        ShoppingListManagerFragment shoppingListFragment = ShoppingListManagerFragment.newInstance(); 
        fragmentTransaction.replace(R.id.container, shoppingListFragment, "shoppinglistmanager"); 
       } 
      } 
      fragmentTransaction.commit(); 
      SharedPreferences preferences = getSharedPreferences(APP_NAME, MODE_PRIVATE); 
      preferences.edit().putInt(SELECTED_POSITION, position).commit(); 
     } 
    }); 

    getActionBar().setCustomView(navSpinner); 
} 

J'appelle setRetainInstance(true); sur le onCreate() de Fragment, mais les fragments ne sont pas persisté. Je vérifie cela en ayant EditText et en y entrant du texte. Pourquoi cela arrive-t-il?

+0

Comment vous écartez-vous du Fragment? Êtes-vous détruire l'activité? – yiati

+0

@yiati Je fais tourner l'appareil –

+0

D'où vient la source de données variable? Il est probable que les identifiants que vous recevez ne sont pas ce que vous voulez. Une alternative à l'utilisation des ID pour restaurer des fragments consiste à utiliser [onSaveInstanceState] (http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState (android.os.Bundle)) et [onViewStateRestored] (http://developer.android.com/reference/android/app/Fragment.html#onViewStateRestored(android.os.Bundle)) de la classe Fragment pour sauvegarder les valeurs primitives et les utiliser pour recréer le fragment. – yiati

Répondre

0

Vous devez définir un identifiant pour EditText, pour que le système Android enregistre et restaure l'état des vues.

De docs:

Note: Pour que le système Android pour restaurer l'état des vues dans votre activité, chaque vue doit avoir un identifiant unique, fourni par l'androïde: attribut id.

Si vous utilisez le fichier de mise en page, spécifiez-le via l'attribut android:id ou si vous créez EditText en utilisant l'API, puis utilisez View.setId.

Questions connexes