Encontrei muitos casos de uma pergunta semelhante no SO, mas infelizmente nenhuma resposta atende aos meus requisitos.
Tenho layouts diferentes para retrato e paisagem e estou usando a pilha traseira, o que me impede de usar setRetainState()
e truques usando rotinas de alteração de configuração.
Eu mostro certas informações para o usuário no TextViews, que não são salvas no manipulador padrão. Ao escrever meu aplicativo apenas usando o Activities, o seguinte funcionou bem:
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
Com Fragment
s, isso funciona apenas em situações muito específicas. Especificamente, o que quebra horrivelmente é substituir um fragmento, colocá-lo na pilha de trás e girar a tela enquanto o novo fragmento é mostrado. Pelo que entendi, o fragmento antigo não recebe uma chamada ao onSaveInstanceState()
ser substituído, mas permanece ligado de alguma forma ao Activity
e esse método é chamado posteriormente quando View
não existe mais, portanto, procurando por qualquer um dos meus TextView
resultados em a NullPointerException
.
Além disso, descobri que manter a referência à minha TextViews
não é uma boa ideia com Fragment
s, mesmo que esteja OK com Activity
's. Nesse caso, onSaveInstanceState()
na verdade salva o estado, mas o problema reaparece se eu girar a tela duas vezes quando o fragmento estiver oculto, pois onCreateView()
ele não é chamado na nova instância.
Pensei em salvar o estado em onDestroyView()
algum Bundle
elemento membro da classe (na verdade são mais dados, não apenas um TextView
) e salvá- lo , onSaveInstanceState()
mas existem outras desvantagens. Principalmente, se o fragmento é atualmente mostrado, a ordem de chamar as duas funções é invertida, então eu precisaria considerar duas situações diferentes. Deve haver uma solução mais limpa e correta!