onSaveInstanceState n'est pas appelée dans le Fragment
Je sais que les gens ont demandé à cette question, mais j'ai suivi toutes les réponses et j'ai toujours le même problème. J'ai deux scripts, est le fragment manager (IngredientsActivity) et l'autre est le fragment (OtherList). Le code est comme suit
IngredientsActivity
import java.util.ArrayList;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class IngredientsActivity extends FragmentActivity implements ActionBar.TabListener {
private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.check_list);
//Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//For each of the sections in the app, add a tab to the action bar.
actionBar.addTab(actionBar.newTab().setText("Alcahol").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Juice").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Other").setTabListener(this));
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); //OVERRIDE SAVE ON MAINCLASS
outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar().getSelectedNavigationIndex());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
if (tab.getPosition() == 0) {
AlcoholList simpleListFragment = new AlcoholList();
getSupportFragmentManager().beginTransaction().replace(R.id.containert, simpleListFragment).commit();
}
else if (tab.getPosition() == 1) {
JuiceList androidlidt = new JuiceList();
getSupportFragmentManager().beginTransaction().replace(R.id.containert, androidlidt).commit();
}
else {
OtherList androidversionlist = new OtherList();
getSupportFragmentManager().beginTransaction().replace(R.id.containert, androidversionlist).commit();
}
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
public static class DummySectionFragment extends Fragment {
public DummySectionFragment() {
}
public static final String ARG_SECTION_NUMBER = "section_number";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setGravity(Gravity.CENTER);
Bundle args = getArguments();
textView.setText(Integer.toString(args.getInt(ARG_SECTION_NUMBER)));
return textView;
}
}
}
OtherList
import java.util.ArrayList;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
public class OtherList extends ListFragment{
MyCustomAdapter dataAdapter = null;
private ArrayList<String> recipesList;
private ArrayList<Items> stateList ;
public OtherList() {
setRetainInstance(true);
stateList = new ArrayList<Items>();
Items _states1 = new Items ("Gin",false);
stateList.add(_states1);
Items _states2 = new Items ("Ginger Liqueur",false);
stateList.add(_states2);
Items _states3 = new Items ("Citrus Vodka",false);
stateList.add(_states3);
Items _states4 = new Items ("Champagne",false);
stateList.add(_states4);
Items _states5 = new Items ("Coconut Rum",false);
stateList.add(_states5);
Items _states6 = new Items ("Pear Vodka",false);
stateList.add(_states6);
Items _states7 = new Items ("Rum",false);
stateList.add(_states7);
Items _states8 = new Items ("Tequila",false);
stateList.add(_states8);
Items _states9 = new Items ("Triple Sec",false);
stateList.add(_states9);
Items _states10 = new Items ("Kahlua",false);
stateList.add(_states10);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataAdapter = new MyCustomAdapter(this.getActivity(),R.layout.da_item, stateList);
setListAdapter(dataAdapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.list_fragment, container, false);
}
@Override
public void onListItemClick(ListView list, View v, int position, long id) {
}
private class MyCustomAdapter extends ArrayAdapter<Items>
{
private ArrayList<Items> stateList;
public MyCustomAdapter(Context context, int textViewResourceId,
ArrayList<Items> stateList)
{
super(context, textViewResourceId, stateList);
this.stateList = new ArrayList<Items>();
this.stateList.addAll(stateList);
}
private class ViewHolder
{
CheckBox name;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
Log.v("ConvertView", String.valueOf(position));
if (convertView == null)
{
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.da_item, null);
holder = new ViewHolder();
holder.name = (CheckBox) convertView.findViewById(R.id.ingredientbox);
convertView.setTag(holder);
holder.name.setOnClickListener( new View.OnClickListener()
{
public void onClick(View v)
{
CheckBox cb = (CheckBox) v;
Items _state = (Items) cb.getTag();
_state.setSelected(cb.isChecked());
}
});
}
else
{
holder = (ViewHolder) convertView.getTag();
}
Items state = stateList.get(position);
holder.name.setText(state.getName());
holder.name.setChecked(state.isSelected());
holder.name.setTag(state);
return convertView;
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.d("hey","SAVING"); //NOT SAVING
super.onSaveInstanceState(outState);
save();
outState.putStringArrayList("index", recipesList);
}
}
}
}
}
J'ai trouvé plusieurs suggestions qui dit de remplacer le onSaveInstanceState , je l'ai fait et j'ai trouvé encore plus de me dire d'utiliser setRetainInstance. Je ne sais pas pourquoi setRetainInstance état serait utile si je veux enregistrer une valeur dans une liste. Ma question: Pourquoi n'Est-il pas l'appel de l'enregistrer dans le OtherList de la classe ou de ce qui est une meilleure méthode pour mettre en œuvre si je veux enregistrer les valeurs dans l'Affichage de la Liste (dans ce cas, je suis à l'aide de cases à cocher)
Lorsque vous attendiez-vous à onSaveInstanceState() est appelé?
Ma question: Pourquoi n'Est-il pas l'appel de l'enregistrer dans le OtherList classe
Dans le OtherList classe quand j'ai changer les onglets ou changer d'activité
OriginalL'auteur user3155092 | 2014-01-02
Vous devez vous connecter pour publier un commentaire.
onSaveInstanceState()
n'est appelée que lorsque le système Android peuvent avoir besoin de recréer l'instance particulière du Fragment. Il existe de nombreux exemples de quitter le Fragment ou même à détruire le Fragment où il ne sera pas appelé. Veuillez consulter la documentation pour plus d'informations, veuillez lire leActivity.onSaveInstanceState()
de la documentation ainsi depuis que les applys ici aussi: http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle)http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)
EDIT: Dans votre cas, vous ne devez pas recréer le fragment chaque fois que l'utilisateur revient à la fragment. Je recommande considérant ViewPager et FragmentPagerAdapter pour gérer automatiquement les fragments. Regardez aussi ce post: ViewPager et fragments — quel est le bon chemin pour stocker fragment de l'état?
Qu'essayez-vous de faire? On dirait que vous êtes il re-création à chaque fois de toute façon. onPause() est toujours appelé si vous avez vraiment besoin de sauver quelque chose.
Le OtherList est un groupe de cases à cocher dans une liste, lorsque l'utilisateur navigue loin de l'affichage de la liste je veux garder les cases qui ont été cochées.
Ok, voulez-vous de rester vérifiée, même si l'utilisateur quitte l'application complètement?
Probablement la meilleure façon est de sauver l'état dans SharedPreferences ou de sauvegarder votre Liste dans un fichier, dans onPause()
OriginalL'auteur Steve M
J'ai eu un problème similaire où j'essayais d'obtenir un Fragment de sauvegarder son état mais onSaveInstanceState() n'a pas été appelé sur FragmentTransaction.replace(). J'ai essayé de trouver une solution pour cela et de la pensée, si le Fragment lui-même ne peut pas enregistrer son propre état ne peut pas tout ce qui est de faire le remplacement de l'enregistrer. J'ai donc fait quelque chose comme ceci:
Dans le Fragment ont une méthode getState() ou ce que vous voulez:
Puis dans l'hébergement de l'objet, de sauver cet ensemble de ses variables d'instance avant de remplacer le Fragment et de définir l'argument qui a sauvé bundle lors de la commutation de retour.
Ensuite, lorsque vous passez d'un retour à un Fragment vous passer le faisceau comme un argument.
Je n'ai pas regarder dans votre code trop profondément, mais il ressemble au problème que j'ai eu à partir de votre description.
Vous pouvez inverser la population de l'état. Au lieu de l'activité de fixer, le fragment en question pourrait l'obtenir lorsque vous êtes prêt.
OriginalL'auteur dt0