No meu aplicativo Android, quando eu giro o dispositivo (deslize o teclado para fora), o meu Activity
é reiniciado ( onCreate
é chamado). Agora, provavelmente é assim que deve ser, mas eu faço muita configuração inicial no onCreate
método, então preciso:
- Coloque toda a configuração inicial em outra função para que nem tudo seja perdido na rotação do dispositivo ou
- Faça assim
onCreate
não seja chamado novamente e o layout apenas se ajuste ou - Limite o aplicativo apenas a retrato para que
onCreate
não seja chamado.
android
rotation
android-activity
Isaac Waller
fonte
fonte
Respostas:
Usando a classe de aplicativo
Dependendo do que você está fazendo em sua inicialização, você pode considerar criar uma nova classe que estenda
Application
e mova seu código de inicialização para umonCreate
método substituído dentro dessa classe.o
onCreate
classe na aplicação é chamada somente quando o aplicativo inteiro é criado; portanto, a atividade é reiniciada com alterações na orientação ou na visibilidade do teclado não a acionará.É uma boa prática expor a instância desta classe como um singleton e expor as variáveis de aplicativo que você está inicializando usando getters e setters.
NOTA: Você precisará especificar o nome da sua nova classe Application no manifesto para que ela seja registrada e usada:
Reagindo a alterações na configuração [UPDATE: isso foi preterido desde a API 13; veja a alternativa recomendada ]
Como alternativa adicional, você pode fazer com que seu aplicativo escute eventos que causariam uma reinicialização - como alterações na orientação e na visibilidade do teclado - e lide com eles na sua Atividade.
Comece adicionando o
android:configChanges
nó ao nó de manifesto da sua atividadeou para Android 3.2 (API nível 13) e mais recente :
Em seguida, na Atividade, substitua o
onConfigurationChanged
método e chamesetContentView
para forçar o layout da GUI a ser refazer na nova orientação.fonte
android:configChanges
) deve ser evitado e usado apenas como último recurso. Leia Manipulando alterações no tempo de execução para obter mais informações sobre como lidar adequadamente com uma reinicialização devido a uma alteração na configuração. Em vez disso, para persistir os dados nos eventos de rotação, eles parecem preferir usar oonSaveInstanceState Bundle
; ou como @ Jon-O menciona ,onRetainNonConfigurationInstance
.onRetainNonConfigurationChanges
é mais tolerante a falhas e direta.Atualização para o Android 3.2 e superior:
fonte
Fragments
e emsetRetainInstance
vez disso.screenSize
para o Android 3.2 e superior, que resolveu o meu problema, obrigado!Em vez de tentar impedir que o
onCreate()
disparador seja totalmente disparado, talvez tente verificar o queBundle
savedInstanceState
foi passado no evento para ver se é nulo ou não.Por exemplo, se eu tiver alguma lógica que deva ser executada quando a
Activity
criação for realmente criada, e não em todas as mudanças de orientação, eu só executarei essa lógicaonCreate()
somente sesavedInstanceState
for nula.Caso contrário, ainda quero que o layout seja redesenhado corretamente para a orientação.
não tenho certeza se essa é a resposta definitiva, mas funciona para mim.
fonte
Intent serverintent = new Intent(MainActivity.this, MessageListener.class);
estartService(serverintent);
para criar umserverSocket = new ServerSocket(0xcff2);
eSocket client = serverSocket.accept();
com umBufferedReader(new InputStreamReader(client.getInputStream()));
e poderia girar minha android e manter a conexão cliente / servidor ativo, ainda têm a rotação GUI. De acordo com o manual, savedInstanceState é inicializado quando a última atividade é encerrada.o que eu fiz...
no manifesto, na seção de atividades, adicionou:
no código da atividade, implementado:
fonte
O que você descreve é o comportamento padrão. Você precisa detectar e manipular esses eventos você mesmo adicionando:
ao seu manifesto e, em seguida, às alterações que você deseja manipular. Portanto, para orientação, você usaria:
e para o teclado ser aberto ou fechado, você usaria:
Se você quiser lidar com ambos, basta separá-los com o comando pipe, como:
Isso acionará o método onConfigurationChanged em qualquer atividade que você chamar. Se você substituir o método, poderá passar os novos valores.
Espero que isto ajude.
fonte
Acabei de descobrir esta sabedoria:
Para manter a Atividade viva por meio de uma mudança de orientação e manipulá-la
onConfigurationChanged
, a documentação e o exemplo de código acima sugerem isso no arquivo Manifest:que tem o benefício extra de sempre funcionar.
O lore bônus é que omitindo o
keyboardHidden
pode parecer lógico, mas provoca falhas no emulador (para Android 2.1 pelo menos): especificando únicaorientation
vai fazer a chamada emulador de ambosOnCreate
eonConfigurationChanged
, por vezes, e apenasOnCreate
outras vezes.Não vi a falha em um dispositivo, mas ouvi falar que o emulador falhou para outras pessoas. Então vale a pena documentar.
fonte
Fragments
e emsetRetainInstance
vez disso.Você também pode considerar usar o modo de persistência de dados da plataforma Android através de alterações de orientação:
onRetainNonConfigurationInstance()
egetLastNonConfigurationInstance()
.Isso permite que você persista os dados nas alterações de configuração, como informações que você pode ter obtido de uma busca no servidor ou qualquer outra coisa que tenha sido computada
onCreate
ou desde então, além de permitir que o Android redimensione seuActivity
uso do arquivo xml para a orientação agora em uso .Veja aqui ou aqui .
Deve-se notar que esses métodos agora estão obsoletos (embora ainda mais flexíveis do que a orientação de manipulação, mude a si mesmo, como sugere a maioria das soluções acima), com a recomendação de que todos mudem para
Fragments
e usemsetRetainInstance(true)
osFragment
que deseja manter.fonte
A abordagem é útil, mas é incompleta ao usar fragmentos.
Fragmentos geralmente são recriados com alterações de configuração. Se você não deseja que isso aconteça, use
setRetainInstance(true);
no (s) construtor (es) do fragmentoIsso fará com que fragmentos sejam retidos durante a alteração da configuração.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
fonte
setRetainInstance()
método @Abdo mencionado.Eu simplesmente adicionei
no arquivo de manifesto e não adicionou nenhum
onConfigurationChanged
método em minha atividade.Portanto, toda vez que o teclado desliza para fora ou nada acontece .
fonte
<application ...android:configChanges="keyboard|keyboardHidden|orientation">
e está funcionando. Minhas configurações no build.gradle:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
O
onCreate
método ainda é chamado mesmo quando você altera oorientation
Android. Portanto, mover toda a funcionalidade pesada para esse método não ajudará vocêfonte
Coloque o código abaixo dentro da sua
<activity>
tag emManifest.xml
:fonte
Que parte do manifesto diz "não ligue
onCreate()
"?Além disso, documentos do Google dizem que para evitar o uso
android:configChanges
(exceto como último recurso) .... Mas, em seguida, os métodos alternativos que sugerem tudo DO usoandroid:configChanges
.Foi minha experiência que o emulador SEMPRE chama
onCreate()
após a rotação.Mas os 1-2 dispositivos em que executo o mesmo código ... não. (Não sei por que haveria alguma diferença.)
fonte
É muito simples, basta seguir os seguintes passos:
Isso funciona para mim:
Nota: a orientação depende da sua solicitação
fonte
As alterações a serem feitas no manifesto do Android são:
As adições a serem feitas dentro da atividade são:
fonte
Adicione esta linha ao seu manifesto: -
e este trecho da atividade: -
fonte
Existem várias maneiras de fazer isso:
Salvar estado da atividade
Você pode salvar o estado da atividade em
onSaveInstanceState
.e use o
bundle
para restaurar o estado.Lidar com as mudanças de orientação sozinho
Outra alternativa é lidar com as mudanças de orientação por conta própria. Mas isso não é considerado uma boa prática.
Adicione isso ao seu arquivo de manifesto.
para Android 3.2 e posterior:
Restringir rotação
Você também pode limitar sua atividade ao modo retrato ou paisagem para evitar a rotação.
Adicione isso à tag de atividade no seu arquivo de manifesto:
Ou implemente isso programaticamente em sua atividade:
fonte
A maneira que eu encontrei de fazer isso é usar os
onRestoreInstanceState
e osonSaveInstanceState
eventos para salvar algo naBundle
(mesmo se você não precisa de quaisquer variáveis salvos, basta colocar alguma coisa lá dentro para que oBundle
não está vazia). Em seguida, noonCreate
método, verifique seBundle
está vazio e, se estiver, faça a inicialização, se não estiver, faça-o.fonte
Mesmo que não seja "o modo Android", obtive resultados muito bons ao lidar com as alterações de orientação e simplesmente reposicionar os widgets em uma exibição para levar em consideração a orientação alterada. Isso é mais rápido do que qualquer outra abordagem, porque suas visualizações não precisam ser salvas e restauradas. Ele também fornece uma experiência mais integrada ao usuário, porque os widgets reposicionados são exatamente os mesmos widgets, apenas movidos e / ou redimensionados. Não apenas o estado do modelo, mas também o estado de exibição, podem ser preservados dessa maneira.
RelativeLayout
Às vezes, pode ser uma boa opção para uma visão que precisa se reorientar de tempos em tempos. Você apenas fornece um conjunto de parâmetros de layout retrato e um conjunto de parâmetros de layout paisagístico, com diferentes regras de posicionamento relativo em cada um, para cada widget filho. Em seguida, no seuonConfigurationChanged()
método, você passa o apropriado para umasetLayoutParams()
chamada em cada filho. Se algum controle filho precisar ser reorientado internamente , basta chamar um método nesse filho para executar a reorientação. Da mesma forma, essa criança chama métodos em qualquer um de seus controles filhos que precisam de reorientação interna e assim por diante.fonte
Toda vez que a tela é girada, a atividade aberta é concluída e onCreate () é chamado novamente.
1 Você pode fazer uma coisa para salvar o estado da atividade quando a tela é girada, de modo que, Você pode recuperar todos os itens antigos quando onCreate () da atividade é chamado novamente. Consulte este link
2) Se você deseja impedir o reinício da atividade, basta colocar as seguintes linhas no arquivo manifest.xml.
fonte
você precisa usar o método onSavedInstanceState para armazenar todo o valor em seu parâmetro é has has bundle
E use
recuperar e definir o valor para visualizar os objetos que manipula as rotações da tela
fonte
Nota: eu posto esta resposta se alguém no futuro enfrentar o mesmo problema que eu. Para mim, a seguinte linha não era suficiente:
Quando eu girei a tela, o método `onConfigurationChanged (Configuration newConfig) não foi chamado.
Solução: eu também tive que adicionar "screenSize", mesmo que o problema tivesse a ver com a orientação. Portanto, no arquivo AndroidManifest.xml, adicione este:
Em seguida, implemente o método
onConfigurationChanged(Configuration newConfig)
fonte
Na seção de atividades do
manifest
, adicione:fonte
Adicione esta linha no manifesto:
android:configChanges="orientation|screenSize"
fonte
As pessoas estão dizendo que você deveria usar
Mas a melhor e mais profissional maneira de lidar com a rotação no Android é usar a classe Loader. Não é uma aula famosa (não sei por quê), mas é muito melhor que o AsyncTask. Para obter mais informações, você pode ler os tutoriais para Android encontrados nos cursos para Android da Udacity.
Obviamente, como outra maneira, você pode armazenar os valores ou as visualizações com onSaveInstanceState e lê-los com onRestoreInstanceState. Depende de você mesmo.
fonte
Depois de um tempo de tentativa e erro, encontrei uma solução que se adapta às minhas necessidades na maioria das situações. Aqui está o código:
Configuração do manifesto:
Atividade principal:
E fragmento de amostra:
Pode ser encontrado no github .
fonte
Use o
orientation
ouvinte para executar tarefas diferentes em diferentes orientações.fonte
Coloque este código abaixo na sua
Activity
emAndroid Manifest
.Isso não reiniciará sua atividade quando você alterar a orientação.
fonte
Corrija a orientação da tela (paisagem ou retrato) em
AndroidManifest.xml
android:screenOrientation="portrait"
ouandroid:screenOrientation="landscape"
para isso, seu
onResume()
método não é chamado.fonte
Um dos melhores componentes da arquitetura android introduzida pelo google cumprirá todos os requisitos exigidos pelo ViewModel.
Ele foi projetado para armazenar e gerenciar dados relacionados à interface do usuário no ciclo de vida, além de permitir que os dados sobrevivam à medida que a tela gira
Consulte o seguinte: https://developer.android.com/topic/libraries/architecture/viewmodel
fonte
Você pode usar o objeto ViewModel em sua atividade.
Os objetos ViewModel são retidos automaticamente durante as alterações na configuração, para que os dados que eles mantêm estejam imediatamente disponíveis para a próxima atividade ou instância de fragmento. Consulte Mais informação:
https://developer.android.com/topic/libraries/architecture/viewmodel
fonte