Estou confuso quando se trata de salvar um estado. Então eu sei que onSaveInstanceState(Bundle)
é chamado quando a atividade está prestes a ser destruída. Mas como armazenar suas informações nele e trazê-lo de volta ao seu estado original onCreate(Bundle savedInstanceState)
? Não entendo como este pacote irá restaurar as informações. Seria útil se alguém pudesse dar um exemplo. O guia Dev não explica isso muito bem.
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);
}
}
Respostas:
O
Bundle
é um contêiner para todas as informações que você deseja salvar. Use as funções put * para inserir dados nele. Aqui está uma pequena lista (há mais) de funções put que você pode usar para armazenar dados noBundle
.Em sua
onCreate
função, issoBundle
é devolvido ao programa. A melhor maneira de verificar se o aplicativo está sendo recarregado ou iniciado pela primeira vez é:Para obter os dados de volta, use as funções get * assim como as funções put *. Os dados são armazenados como um par nome-valor. É como um hashmap. Você fornece uma chave e o valor e, quando deseja o valor de volta, fornece a chave e a função obtém o valor. Aqui está um pequeno exemplo.
Sua mensagem salva será torrada na tela. Espero que isto ajude.
fonte
Uma observação importante que todos os novos desenvolvedores Android devem saber é que qualquer informação em Widgets (TextView, Botões, etc.) será persistida automaticamente pelo Android, desde que você atribua um ID a eles. Isso significa que a maior parte do estado da interface do usuário é tratada sem problemas. Somente quando você precisa armazenar outros dados, isso se torna um problema.
Do Android Docs :
fonte
Uma boa informação: você não precisa verificar se o objeto Bundle é nulo no método onCreate (). Use o método onRestoreInstanceState (), que o sistema chama após o método onStart (). O sistema chama onRestoreInstanceState () apenas se houver um estado salvo para restaurar, então você não precisa verificar se o Bundle é nulo
fonte
Guardar informação:
Se você não deseja restaurar informações em seu método onCreate:
Aqui estão os exemplos: Recriando uma atividade
fonte
Basicamente, onSaveInstanceState (Bundle outBundle) lhe dará um bundle. Quando você olhar para a classe Bundle, verá que pode colocar muitas coisas diferentes dentro dela. Na próxima chamada de onCreate (), você apenas obterá esse Bundle de volta como um argumento. Então você pode ler seus valores novamente e restaurar sua atividade.
Digamos que você tenha uma atividade com um EditText. O usuário escreveu algum texto dentro dele. Depois disso, o sistema chama seu onSaveInstanceState (). Você lê o texto do EditText e o grava no Bundle por meio de Bundle.putString ("edit_text_value", theValue).
Agora onCreate é chamado. Você verifica se o pacote fornecido não é nulo. Se for esse o caso, você pode restaurar seu valor por meio de Bundle.getString ("edit_text_value") e colocá-lo de volta em seu EditText.
fonte
Isso é para informações extras.
Imagine este cenário
ActivityB lança um novo ActivityAPrime por
ActivityAPrime não tem relacionamento com ActivityA.
Nesse caso, o Bundle em ActivityAPrime.onCreate () será nulo.
Se ActivityA e ActivityAPrime devem ser a mesma atividade em vez de atividades diferentes, ActivityB deve chamar finish () em vez de startActivity ().
fonte
Se os dados não forem carregados de,
savedInstanceState
use o código a seguir.O problema é que a chamada de url não deve ser totalmente concluída, portanto, verifique se os dados foram carregados e mostre o valor de instanceState.
fonte