Como especifico layouts diferentes para orientações de retrato e paisagem?

142

Eu já vi referências para poder especificar dois arquivos xml de layout separados para uma atividade, um para retrato e outro para paisagem. Ainda não encontrei nenhuma informação sobre como fazer isso. Como especificar para cada atividade qual arquivo xml é seu layout de retrato e qual é o layout de Paisagem?

Também é possível especificar layouts diferentes para diferentes tamanhos de tela? Se sim, como isso é feito?

Jay Askren
fonte

Respostas:

203

Crie um layout-landdiretório e coloque a versão horizontal do seu arquivo XML de layout nesse diretório.

Mark B
fonte
3
Isso significa que todas as atividades precisam definir uma visualização paisagem e retrato se eu fizer isso?
Jay Askren
20
Não, se não existir uma definição de layout-land, ela apenas usa o layout XML no diretório de layout padrão.
Mark B
no meu caso, layout-land não está funcionando quando estou usando, android: configChanges = "guidance | keyboardHidden | screenSize"
Tushar Pandey
9
Remover orientação do android: configChanges = "orientação | keyboardHidden | screenSize"
Ushal Naidoo 4/14
60

Você só precisa colocá-lo em pastas separadas com nomes diferentes, dependendo da orientação e da resolução. O dispositivo selecionará automaticamente o caminho certo para as configurações da tela.

Mais informações aqui:

http://developer.android.com/guide/practices/screens_support.html

em "Qualificadores do diretório de recursos para tamanho e densidade da tela"

Silvio Donnini
fonte
Funciona apenas para versões do SO 1.6 ou superior. Se você deseja suportar a versão 1.5, precisa deste link: developer.android.com/guide/practices/screens-support-1.5.html
Scott Biggs
2
@Silvio Donnini - os links não têm mais as informações necessárias.
itsaboutcode
2
@itsaboutcode Sim, sim: vá para "Usando qualificadores de configuração"
Danation
27

Para amantes do rato! Digo com o botão direito do mouse na pasta de recursos e Add new resource file, em Qualificadores disponíveis, selecione o orientation:

insira a descrição da imagem aqui


Mas você ainda pode fazê-lo manualmente, digitando, adicionando a subpasta "layout-land" a

"Seu-diretório-de-projeto \ app \ src \ main \ res"

desde então, qualquer arquivo layout.xml nesta subpasta funcionará automaticamente no modo paisagem automaticamente .

Use "layout-port" para o modo retrato.

AmiNadimi
fonte
1
Isso funcionou para mim. Adicionei um novo arquivo de layout conforme as instruções com o mesmo nome da versão em retrato. O Android Studio criou automaticamente uma pasta para esse layout. Um layout para retrato e outro para paisagem. O novo layout é exibido automaticamente ao girar a tela.
Smitty-Werben-Jager-Manjenson
23

Apenas um lembrete:

Remova orientationdo android:configChangesatributo para a atividade no seu xmlarquivo de manifesto se você o definiu:

android:configChanges="orientation|screenLayout|screenSize"
Robin Qiu
fonte
1
e se eu precisar ter o android: configChanges = "orientação | screenLayout | screenSize" no meu manifesto, pois alguns dos meus fragmentos podem estar na orientação e outros não, mas ainda precisam de layouts separados para paisagem e retrato para os fragmentos que pode mudar a orientação dinamicamente?
natansalda 20/02
9

Maneira mais rápida para o Android Studio 3.xx e o Android Studio 4.xx

1. Vá para a guia Design do layout da atividade

2.No topo, você deve pressionar o botão de orientação para visualização, há uma opção para criar um layout de paisagem (verifique a imagem), uma nova pasta será criada como seu arquivo de layout xml para essa orientação específica

insira a descrição da imagem aqui

Shid
fonte
4

Acho que a maneira mais fácil nas versões mais recentes do Android é ir para o modo Design de um XML (não texto).

Em seguida, no menu, selecione a opção - Criar variação de paisagem. Isso criará um xml de paisagem sem problemas em alguns segundos. A versão mais recente do Android Studio permite criar uma visualização em paisagem imediatamente.

insira a descrição da imagem aqui

Espero que isso funcione pra você.

Akanshi Srivastava
fonte
3

Crie um novo diretório layout-land, em seguida, criar xmlarquivo com mesmo nome em layout-landcomo era layoutdiretório e alinhar lá o seu conteúdo para o modo paisagem.

Observe que o ID do conteúdo em ambos xmlé o mesmo.

Nouman Shah
fonte
3

A última linha abaixo é um exemplo para a aplicação de dois quantificadores: tela paisagem e largura menor (600dp). Atualize 600dp com os que você precisa.

res/layout/main_activity.xml                # For handsets
res/layout-land/main_activity.xml           # For handsets in landscape
res/layout-sw600dp/main_activity.xml        # For 7” tablets
res/layout-sw600dp-land/main_activity.xml   # For 7” tablets in landscape

O acima se aplica a dimens também

res/values/dimens.xml                # For handsets
res/values-land/dimens.xml           # For handsets in landscape
res/values-sw600dp/dimens.xml        # For 7” tablets
res/values-sw600dp-land/dimens.xml   # For 7” tablets in landscape

Métricas úteis do dispositivo: https://material.io/tools/devices/

caçador
fonte
2

Ou use isto:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:scrollbars="vertical" 
            android:layout_height="wrap_content" 
            android:layout_width="fill_parent">

  <LinearLayout android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

     <!-- Add your UI elements inside the inner most linear layout -->

  </LinearLayout>
</ScrollView>
Gigante
fonte
0
  1. Clique com o botão direito na pasta res,
  2. Novo -> Arquivo de Recursos do Android
  3. em Qualificadores disponíveis, selecione Orientação,
  4. adicionar ao qualificador escolhido
  5. na orientação da tela, selecione paisagem
  6. pressione OK

Usando o Android Studio 3.4.1, ele não cria mais a layout-landpasta . Ele criará uma pasta e juntará dois arquivos de layout.

insira a descrição da imagem aqui

eos1d3
fonte
2
Incorreta. Você não está usando o modo de exibição de pastas (como "Projeto"). Você provavelmente está usando o modo de exibição "Android", que agrupa arquivos como em sua captura de tela em pastas virtuais, mas a estrutura de pastas real ainda é como todas as outras postagens aqui descritas.
monK_