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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top