Manipulando graciosamente a mudança de orientação da tela durante o início da atividade

StackOverflow https://stackoverflow.com/questions/2434071

Pergunta

Estou tentando encontrar uma maneira de lidar adequadamente com a configuração de uma atividade em que sua orientação é determinada a partir de dados na intenção que o lançou. É para um jogo em que o usuário pode escolher níveis, alguns dos quais são orientação para retratos e alguns são orientação para a paisagem. O problema que estou enfrentando é que setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) não entra em vigor até que a atividade esteja totalmente carregada. Isso é um problema para mim, porque faço algum processo de carga e processamento de imagem durante a inicialização, o que eu gostaria de fazer apenas uma vez.

Atualmente, se o usuário escolher um nível de paisagem:

  • A atividade inicia OnCreate (), inadimplente para o retrato
  • descobre ao analisar sua intenção de lançamento de que deveria estar na orientação da paisagem
  • continua independentemente de todo o caminho até o OnResume (), carregando informações e executando outras tarefas de configuração
  • Nesse ponto
  • Então, então inicia o OnCreate () e corre para o OnResume () repetindo a configuração de antecipadamente

Existe uma maneira de evitar isso e não executar o carregamento duas vezes? Por exemplo, idealmente, a atividade saberia antes mesmo de o OnCreate ser chamado, se deveria ser paisagem ou retrato, dependendo de algumas propriedades da intenção de lançamento, mas, a menos que eu tenha perdido algo que não seja possível. Consegui hackear uma maneira de evitar repetir o carregamento verificando um boolean antes das etapas de carregamento demoradas, mas isso não parece a maneira certa de fazê-lo. Eu imagino que eu poderia substituir onSaveInstanceState, mas isso exigiria muita codificação adicional. Existe uma maneira simples de fazer isso?

Obrigado!


Solução:

De acordo com a resposta de Daniel, isso foi realmente muito fácil de consertar. Eu só precisava fazer algumas pequenas alterações. Na minha atividade de 'menu', onde o jogador escolheria qual nível jogar, eu só precisava adicionar um if/else verifique para escolher qual classe seria iniciada por minha intenção. Isso foi feito com um INT simples representando retrato ou paisagem, determinada quando o jogador selecionou um nível. Eu então criei uma segunda classe que estendeu minha classe 'Gamelogic'; Esta é a classe que continha a maior parte do código para o próprio jogo, em vez dos menus, instruções etc.

public class GameLandscape extends GameLogic{
}

Literalmente tão simples e completamente vazio. Dessa forma, herdou todo o código da minha atividade anterior, onde eu já o codificava para lidar com as coisas de maneira diferente, dependendo da orientação. Por fim, eu apenas tive que adicionar uma linha ao manifesto, afirmando que a paisagem da Gameland sempre corria na paisagem, e Gamelogic sempre funcionava em retrato.

Então, um problema simples, de fato.

Foi útil?

Solução

Você pode fazer duas atividades - uma para níveis de retrato, a outra para os níveis de paisagem - e depois definir a orientação da atividade no AndroidManifest.xml, usando o android:screenOrientation atributo. Você nem precisará duplicar o código se usar a herança; Use sua atividade atual como atividade base e basta criar as atividades da paisagem/retrato como subclasses dessa atividade.

Eu acho que uma solução melhor seria para a intenção de abrir a atividade correta desses dois, embora se você precisar ter tudo ser roteado por meio de análise extra de intenção, você pode encaminhar todos os níveis para uma terceira atividade que não faz nada mais do que analisar a intenção e Em seguida, encaminhe -o para a atividade adequada.

Outras dicas

Você também pode substituir onRetainNonConfigurationInstance(). Isso permite armazenar temporariamente um item que você pode recuperar ligando getLastNonConfigurationInstance(). Dessa forma, você pode carregar todas as coisas que você precisa e em seu onRetainNonConfigurationInstance() Método Você pode salvar tudo em uma estrutura de dados e retorná -lo. O seu onCreate() você pode ligar getLastNonConfigurationInstance() E se isso retornar carregar nulo, carregue todas as suas coisas, se ele retornar algo, você está carregado. Aqui está um exemplo rápido:

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        DataStructure myData = (DataStructure)getLastNonConfigurationInstance();
        if(myData == null)
        {
            // Load everything in
        }
        else
        {
            // Unpack myData
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance()
    {
        DataStructure myData = new DataStructure();
        // Put everything in to myData
        return myData;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top