web-dev-qa-db-fra.com

Comment utiliser l'exemple onSavedInstanceState s'il vous plaît

Je suis confus quand il s'agit de sauver un État. Je sais donc que onSaveInstanceState(Bundle) est appelé lorsque l'activité est sur le point d'être détruite. Mais comment stockez-vous vos informations et les ramenez à leur état d'origine dans onCreate(Bundle savedInstanceState)? Je ne comprends pas comment cet ensemble va restaurer des informations. Il serait utile que quelqu'un puisse donner un exemple ... Le guide de développement n'explique pas très bien cela.

public class Conversation extends Activity {
    private ProgressDialog progDialog;
    int typeBar;
    TextView text1;
    EditText edit;
    Button respond;
    private String name;
    private String textAtView;
    private String savedName;

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

        setContentView(R.layout.dorothydialog);
        text1 = (TextView)findViewById(R.id.dialog);
        edit = (EditText)findViewById(R.id.repsond);
        respond = (Button)findViewById(R.id.button01);

        if(savedInstanceState != null){
            savedInstanceState.get(savedName);
            text1.setText(savedName);
        }
        else{
            text1.setText("Hello! What is your name?");
            respond.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    name = edit.getText().toString();
                    text1.setText("Nice to meet you "+ name);
                }   
            });
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        outState.putString(savedName, name);
    }
}
99
tj walker

La Bundle est un conteneur de toutes les informations que vous souhaitez enregistrer. Vous utilisez les fonctions put * pour y insérer des données. Voici une courte liste (il y en a plus) de fonctions de vente que vous pouvez utiliser pour stocker des données dans Bundle.

putString
putBoolean
putByte
putChar
putFloat
putLong
putShort
putParcelable (used for objects but they must implement Parcelable)

Dans votre fonction onCreate, cette Bundle est restituée au programme. Le meilleur moyen de vérifier si l'application est en cours de rechargement ou démarrée pour la première fois est:

if (savedInstanceState != null) {
    // Then the application is being reloaded
}

Pour récupérer les données, utilisez les fonctions get * exactement comme les fonctions put *. Les données sont stockées sous la forme d'une paire nom-valeur. C'est comme un hashmap. Vous fournissez une clé et la valeur, puis lorsque vous souhaitez récupérer la valeur, vous donnez la clé et la fonction obtient la valeur. Voici un court exemple.

@Override
public void onSaveInstanceState(Bundle outState) {
   outState.putString("message", "This is my message to be reloaded");
   super.onSaveInstanceState(outState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        String message = savedInstanceState.getString("message");
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

Votre message enregistré sera grillé à l'écran. J'espère que cela t'aides.

176
Spidy

Tous les nouveaux développeurs Android doivent savoir que toutes les informations contenues dans les widgets (TextView, Boutons, etc.) seront automatiquement conservées par Android tant que vous leur affectez un ID. Cela signifie donc que la majeure partie de l'état de l'interface utilisateur est prise en charge sans problème. Cela ne devient un problème que lorsque vous devez stocker d'autres données.

De Docs Android :

Le seul travail requis par vous est de fournissez un ID unique (avec l'attribut Android: id) pour chaque widget vous voulez sauver son état. Si un le widget n'a pas d'identifiant, alors il ne peut pas sauver son état

30
Keith Adler

Une bonne information: vous n'avez pas besoin de vérifier si l'objet Bundle est null dans la méthode onCreate (). Utilisez la méthode onRestoreInstanceState (), que le système appelle après la méthode onStart (). Le système appelle onRestoreInstanceState () uniquement s'il existe un état enregistré à restaurer. Vous n'avez donc pas besoin de vérifier si le paquet est null. 

5
Diego Souza

Informations sur le magasin:

static final String PLAYER_SCORE = "playerScore";
static final String PLAYER_LEVEL = "playerLevel";

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore);
    savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}

Si vous ne souhaitez pas restaurer les informations dans votre méthode onCreate:

Voici les exemples: Recréer une activité

Au lieu de restaurer l'état pendant onCreate (), vous pouvez choisir d'implémenter onRestoreInstanceState (), que le système appelle après la méthode onStart (). Le système appelle onRestoreInstanceState () uniquement s'il existe un état enregistré à restaurer. Vous n'avez donc pas besoin de vérifier si le paquet est null.

public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}
3
Klatschen

Si les données ne sont pas chargées depuis savedInstanceState, utilisez le code suivant.
Le problème est que l’appel url n’est pas complet, alors vérifiez si les données sont chargées pour afficher la valeur instanceState 

//suppose data is not Loaded to savedInstanceState at 1st swipe
if (savedInstanceState == null && !mAlreadyLoaded){
    mAlreadyLoaded = true;
    GetStoryData();//Url Call
} else {
    if (listArray != null) {  //Data Array From JsonArray(ListArray)
        System.out.println("LocalData  " + listArray);
        view.findViewById(R.id.progressBar).setVisibility(View.GONE);
    }else{
        GetStoryData();//Url Call
    }
}
0
Mathan Chinna

Ceci est pour des informations supplémentaires.

Imaginez ce scénario

  1. ActivitéA lancer ActivityB.
  2. ActivityB lance un nouveau ActivityAPrime par

    Intent intent = new Intent(getApplicationContext(), ActivityA.class);
    startActivity(intent);
    
  3. ActivityAPrime n'a aucun lien avec ActivityA.
    Dans ce cas, le paquet dans ActivityAPrime.onCreate () sera null. 

Si ActivityA et ActivityAPrime doivent être la même activité au lieu d'activités différentes, ActivityB doit appeler finish () plutôt que startActivity ().

0
ken

Fondamentalement, onSaveInstanceState (Bundle outBundle) vous donnera un paquet . Lorsque vous regardez la classe Bundle, vous verrez que vous pouvez y insérer beaucoup de choses différentes. Lors du prochain appel de onCreate (), vous récupérez simplement cet ensemble sous forme d'argument . Vous pourrez ensuite relire vos valeurs et restaurer votre activité.

Disons que vous avez une activité avec un EditText. L'utilisateur a écrit du texte à l'intérieur de celui-ci . Après cela, le système appelle votre onSaveInstanceState () . Vous lisez le texte depuis EditText et l'écrivez dans le Bundle via Bundle.putString ("edit_text_value", theValue).

OnCreate s’appelle maintenant. Vous vérifiez si le paquet fourni n'est pas null. Si c'est le cas, vous pouvez restaurer votre valeur via Bundle.getString ("edit_text_value") et la remettre dans votre EditText.

0
user658042