Minha atividade principal tem algum código que faz algumas alterações no banco de dados que não devem ser interrompidas. Estou fazendo o trabalho pesado em outro tópico e usando uma caixa de diálogo de progresso que defini como não cancelável. No entanto, notei que se eu girar meu telefone, ele reinicia a atividade, que é MUITO ruim para o processo que estava em execução, e recebo um Forçar fechamento.
O que eu quero fazer é desativar programaticamente as alterações de orientação da tela até que meu processo seja concluído, momento em que as alterações de orientação são ativadas.
android
screen-orientation
android-orientation
Christopher Perry
fonte
fonte
Respostas:
Conforme explicado por Chris em sua auto-resposta , ligando
e depois
realmente funciona muito bem ... em dispositivos reais!
Não pense que está quebrado ao testar no emulador, o atalho ctrl + F11 SEMPRE muda a orientação da tela, sem emular movimentos dos sensores.
EDIT: esta não era a melhor resposta possível. Conforme explicado nos comentários, há problemas com esse método. A verdadeira resposta está aqui .
fonte
ActivityInfo.SCREEN_ORIENTATION_SENSOR
não respeita o bloqueio de orientação nativo do Android. Redefinir a orientação paraActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
sim.Nenhuma das outras respostas funcionou perfeitamente para mim, mas aqui está o que descobri que sim.
Travar orientação para o atual ...
Quando a mudança de orientação for permitida novamente, volte ao padrão ...
fonte
Configuration.ORIENTATION_PORTRAIT
será retornado em ambos os modos de paisagem (ou seja, 'normal' e reverso). Portanto, se o telefone estiver na orientação paisagem invertida e você configurá-ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
lo, ele ficará de cabeça para baixo. Na API 9, ActivityInfo apresentaSCREEN_ORIENTATION_REVERSE_LANDSCAPE
constante, mas não vejo uma maneira de detectar tal orientação por meio deConfiguration
classe.Aqui está uma solução mais completa e atualizada que funciona para API 8+, funciona para retrato reverso e paisagem e funciona em uma guia do Galaxy onde a orientação "natural" é paisagem (chame
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
para desbloquear a orientação):fonte
static
e adicionarActivity activity
como um parâmetro.Para gerenciar também os modos de orientação reversa, usei esse código para corrigir a orientação da atividade:
E para permitir novamente a orientação:
fonte
Use
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
para bloquear a orientação atual, seja paisagem ou retrato.Use
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
para desbloquear a orientação.fonte
Eu encontrei a resposta. Para fazer isso, em uma Activity você pode chamar
setRequestedOrientation(int)
com um dos valores especificados aqui: http://developer.android.com/reference/android/R.attr.html#screenOrientationAntes de iniciar meu tópico, chamei
setRequestedOrientation(OFF)
(OFF = nosensor) e quando o tópico estava pronto chameisetRequestedOrientation(ON)
(ON = sensor). Funciona como um encanto.fonte
Obrigado a todos. Modifiquei a solução do Pilot_51, para ter certeza de que restaurou ao estado anterior. Também incluí uma mudança para oferecer suporte a telas não horizontais e não retratos (mas não testei em uma tela assim).
Então, para restaurá-lo
fonte
switch
embora.fonte
Aqui está uma solução que sempre funciona e preserva a orientação atual (usando
Activity.Info.SCREEN_ORIENTATION_PORTRAIT
conjuntos de 0 ° por exemplo, mas o usuário pode ter uma orientação de 180 ° como a atual).fonte
use
ActivityInfo.SCREEN_ORIENTATION_USER
se quiser girar a tela apenas se estiver habilitado no dispositivo.fonte
Isso funciona prefeito para mim. Resolve o problema com diferentes "orientações naturais" do tablet / telefone;)
fonte
Eu descobri uma solução que depende da rotação da tela e então decide a orientação do dispositivo. Conhecendo a orientação, podemos bloquear a orientação e liberá-la mais tarde, quando necessário. Esta solução também pode determinar se o dispositivo está no modo paisagem reversa .
Depois, se precisarmos liberar a orientação, podemos chamar este método:
fonte
Acho que este código é mais fácil de ler.
fonte
Eu descobri que uma combinação de valores de rotação / orientação existentes são necessários para cobrir as quatro possibilidades; há os valores retrato / paisagem e a orientação natural do dispositivo. Digamos que a orientação natural dos dispositivos terá um valor de rotação de 0 grau quando a tela estiver na orientação retrato ou paisagem "natural". Da mesma forma, haverá um valor de rotação de 90 graus quando estiver em paisagem ou retrato (observe que é o oposto da orientação a 0 graus). Portanto, os valores de rotação que não são 0 ou 90 graus implicarão na orientação "Reversa". Ok, aqui está um código:
fonte
Não gostei da maioria das respostas aqui, pois no desbloqueio eles definiram como NÃO ESPECIFICADO ao contrário do estado anterior. O ProjectJourneyman levou isso em consideração, o que foi ótimo, mas eu preferia o código de bloqueio do Roy. Portanto, minha recomendação seria uma mistura dos dois:
fonte
Você pode usar
fonte
use aquela linha de código
no seu método de criação de atividade
fonte