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 Fragments, 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 Activitye esse método é chamado posteriormente quando Viewnão existe mais, portanto, procurando por qualquer um dos meus TextViewresultados em a NullPointerException.
Além disso, descobri que manter a referência à minha TextViewsnão é uma boa ideia com Fragments, 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 Bundleelemento 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!