Android - comutar entre o modo retrato e paisagem torna valores perder Intenção
-
06-09-2019 - |
Pergunta
Eu estou usando Intenções para alternar entre as atividades em meu aplicativo Android. Estou colocando dados no Intenção para uso na próxima atividade. Quando eu ligar o telefone entre os modos retrato e paisagem, os valores passados ??da intenção está perdido e eu recebo um NullPointerException.
Alguém por favor pode me dizer o que poderia estar errado.
Há um monte de código para publicá-la inteiramente. Mas, se alguém precisa de olhar para partes específicas do código, eu posso postá-lo aqui.
Editar
Eu resolvi a questão do Estado não ser salvo. Mas um outro problema que eu enfrentei é que nenhum dos botões na tela trabalho após a orientação foi alterada. Em pressione o botão, eu recebo este aviso em LogCat
02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0
Por favor, ajuda.
Solução
Quando mudar a orientação da atividade é recriada e onCreate Recorde-se que você tem que usar o pacote para salvar seu estado atual e restaurar depois de uma mudança de orientação. Você pode ver isso em ação se você tiver apenas um app com um TextView e você entra em orientação de texto e mudança. Se você unir seu estado para onCreate você pode travar esta. Esta é, provavelmente, também por isso que você tem um NullPointer após as mudanças de orientação. É chato como o inferno, mas algo que temos de viver com ele.
Este link em uma série de tutoriais de orientação e este primeiro um em particular deve ajudar a compreender exatamente o que está acontecendo e como manter com sucesso o seu estado atual.
Update: Há também um post sobre SO em rotação Android que lida com quase a mesma coisa.
Editar para acompanhamento pergunta:
Você quis voltar a ligar seus manipuladores de clique após a mudança de orientação?
Outras dicas
Escreva isso no seu file..in manifesto qual a atividade que você quer isso -
android:configChanges="orientation|keyboardHidden"
Editado: Use este para versões novas APIs -
android:configChanges="orientation|keyboardHidden|screenSize"
Definitivamente ele vai funcionar ..
Tente isto:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(SOME_KEY, "blah blah blah");
}
@Override
public void onCreate(Bundle savedInstanceState) {
...
somevalue = savedInstanceState.getString(SOME_KEY);
...
}
É possível declarar um atributo android: configChanges com o valor de "orientação", isso vai impedir a atividade de ser reiniciado. Em vez disso, os restos de atividade em execução e seu onConfigurationChanged () é chamado.
Declare < android:configChanges="orientation|keyboardHidden"/>
em seu manifesto. Isto permite-lhe gerir a mudança de visibilidade Orientação / teclado sozinho. Claro, você não precisa substituir o método de retorno de chamada para gerenciá-lo.
Oi eu também encontrei este problema. que fixa-lo para mim foi:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putString("Username", mUsername);
savedInstanceState.putString("Password", mPassword);
savedInstanceState.putString("UserID", mUserID);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
e, em seguida, em onCreate ():
if (savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
if(extras == null) {
mUsername = "?";
mPassword = "?";
mUserID = "?";
} else {
mUsername = extras.getString("Username");
mPassword = extras.getString("Password");
mUserID = extras.getString("UserID");
}
} else {
mUsername = (String) savedInstanceState.getSerializable("Username");
mPassword = (String) savedInstanceState.getSerializable("Password");
mUserID = (String) savedInstanceState.getSerializable("UserID");
}
então você pode ter certeza que os objetos não são nulos.