Gostaria que os tablets pudessem ser exibidos em retrato e paisagem (sw600dp ou superior), mas os telefones devem ser restritos apenas a retrato. Não consigo encontrar uma maneira de escolher uma orientação condicionalmente. Alguma sugestão?
android
tablet
screen-orientation
Kenny Wyland
fonte
fonte
layout-land
internares
.Respostas:
Aqui está uma boa maneira de usar qualificadores de recursos e tamanho .
Coloque esse recurso bool em res / values como bools.xml ou o que for (nomes de arquivos não importam aqui):
Coloque este em res / values-sw600dp e res / values-xlarge:
Veja esta resposta suplementar para obter ajuda sobre como adicionar esses diretórios e arquivos no Android Studio.
Em seguida, no método onCreate de suas atividades, você pode fazer isso:
Os dispositivos que são mais do que 600 dp na direcção da largura mais pequena, ou x larga em dispositivos de pré-Android 3.2 (comprimidos, basicamente) irá comportar-se como o normal, baseado no sensor e rotação bloqueado pelo utilizador, etc . Todo o resto (telefones, basicamente) será apenas retrato.
fonte
xlarge
também ou posso usarsw600dp
? Provavelmente, não há tablets executando <3,2 nos dias de hoje.onCreate()
. Quando mudei a chamada parasetRequestedOrientation()
uma posição diferente no tempo e no contexto, o reinício não aconteceu mais.Você pode tentar dessa maneira primeiro obter o tamanho da tela do dispositivo
e depois defina a orientação de acordo com
fonte
Configuration
fornecescreenLayout
informações - DPI. Considerando que a questão está relacionada ao tamanho da tela do dispositivo físico - telefone VS tablet. Ou seja, você pode ter umConfiguration.SCREENLAYOUT_SIZE_NORMAL
e seria um tablet MDPI.Suplemento à resposta aceita
Você pode executar as seguintes etapas no Android Studio para adicionar os diretórios
res/values-sw600dp
eres/values-large
com seusbools.xml
arquivos.values-sw600dp
Primeiro, na guia Projeto, selecione o filtro Projeto (em vez do Android) no navegador.
Em seguida, clique com o botão direito do mouse no
app/src/main/res
diretório Escolha Novo > Diretório de Recursos do Android .Selecione Menor largura da tela e pressione o botão >> .
Digite
600
para a menor largura da tela. O nome do diretório será gerado automaticamente. Diga OK.Em seguida, clique com o botão direito do mouse no
values-sw600dp
arquivo recém-criado . Escolha Novo > Arquivo de Recurso Valores . Tipobools
para o nome.valores-grandes
A adição de um
values-large
diretório é necessária apenas se você estiver suportando o pré-Android 3.2 (nível 13 da API). Caso contrário, você pode pular esta etapa. Ovalues-large
diretório corresponde avalues-sw600dp
. (values-xlarge
corresponde avalues-sw720dp
.)Para criar o
values-large
diretório, siga as mesmas etapas acima, mas, neste caso, escolha Tamanho em vez de Menor largura da tela. Selecione grande . O nome do diretório será gerado automaticamente.Clique com o botão direito do mouse no diretório como antes para criar o
bools.xml
arquivo.fonte
Aqui está como eu fiz isso (inspirado em http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html ):
No AndroidManifest.xml, para cada atividade que você deseja alterar entre retrato e paisagem (adicione screenSize - você não costumava precisar disso!). Você não precisa definir uma orientação de tela aqui. :
Métodos para adicionar em cada atividade:
e: (se você não substituir esse método, o aplicativo chamará onCreate () ao alterar as orientações)
Em onCreate () de cada atividade:
A única coisa que não consigo entender é como fazer com que o aplicativo altere os arquivos de layout ao mudar de paisagem para retrato ou vice-versa. Presumo que a resposta esteja fazendo algo semelhante ao que o link acima faz, mas não consegui que isso funcionasse para mim - ele excluiu todos os meus dados. Mas se você tiver um aplicativo simples o suficiente para ter o mesmo arquivo de layout para retrato e paisagem, isso funcionará.
fonte
Seguindo a resposta de Ginny , acho que a maneira mais confiável de fazer isso é a seguinte:
Conforme descrito aqui , coloque um booleano nos recursos sw600dp. Ele deve ter o prefixo sw, caso contrário não funcionará corretamente:
em res / values-sw600dp / dimens.xml
em res / values / dimens.xml
Em seguida, crie um método para recuperar esse booleano:
E uma atividade base a ser estendida das atividades em que você deseja esse comportamento:
Portanto, cada atividade estenderia BaseActivity:
Importante : mesmo que você estenda de
BaseActivity
, você deve adicionar a linhaandroid:configChanges="orientation|screenSize"
a cadaActivity
no seu AndroidManifest.xml:fonte
Bem, isso é um pouco tarde, mas, aqui está uma solução Somente XML, mas uma hack, que não recria uma atividade como
setRequestedOrientation
faz se for necessário alterar a orientação:https://stackoverflow.com/a/27015879/1281930
fonte
Após a resposta aceita , estou adicionando o arquivo kotlin com a solução espero que ajude alguém
Coloque esse recurso bool
res/values
como bools.xml ou o que for (nomes de arquivos não importam aqui):Coloque este aqui
res/values-sw600dp
eres/values-sw600dp-land
:Em seguida, adicione-o nas linhas abaixo da sua atividade ou fragmentidade
fonte
Outras soluções não funcionaram para mim. Eu ainda tinha algum problema de orientação estranho com diálogos e questões de recreação. Minha solução foi estender a Atividade, forçando-a como retrato em manifesto.
Exemplo:
manifest.xml:
na atividade de tela inicial:
fonte
Velha pergunta eu sei. Para executar seu aplicativo sempre no modo retrato, mesmo quando a orientação pode ser ou é trocada, etc. (por exemplo, em tablets), projetei essa função que é usada para definir o dispositivo na orientação correta sem a necessidade de saber como o retrato e a paisagem recursos estão organizados no dispositivo.
Funciona como um encanto!
AVISO: Altere de acordo
this.activity
com sua atividade ou adicione-o à atividade principal e removathis.activity
;-)Se você quiser fazer o oposto, deve alterar o código para paisagem (mas acho que fica claro como fazer isso).
fonte
Infelizmente, usando o método setRequestedOrientation (...) fará com que a atividade reinicie; portanto, mesmo que você chame isso no método onCreate, ele passará pelo ciclo de vida da atividade e, em seguida, recriará a mesma atividade na orientação solicitada. Portanto, na resposta de @Brian Christensen, você deve considerar que o código de atividade pode ser chamado duas vezes, isso pode ter efeitos negativos (não apenas visuais, mas também em solicitações de rede, análises, etc.).
Além disso, definir o atributo configChanges no manifesto é, na minha opinião, uma grande desvantagem, o que pode levar um enorme custo de refatoração. Os desenvolvedores do Android não recomendam alterar esse atributo .
Por fim, tentar definir a ScreenOrientation de alguma forma diferente (para evitar o problema de reinicialização) é impossível, estaticamente impossível devido ao manifesto estático que não pode ser alterado, programaticamente, só é possível chamar esse método na atividade já iniciada.
Resumo: na minha opinião, a sugestão de @Brian Christensen é a melhor opção, mas lembre-se do problema de reiniciar a atividade.
fonte