How do I specify different layouts for portrait and landscape orientations?
Asked Answered
T

11

161

I've seen references to being able to specify two separate layout xml files for an activity, one for Portrait and one for Landscape. I've not been to find any information on how to do that though. How do I specify for each activity which xml file is it's portrait layout and which is the Landscape layout?

Is it also possible to specify different layouts for different screen sizes? If so, how is this done?

Trailblazer answered 23/1, 2010 at 17:44 Comment(0)
O
221

Create a layout-land directory and put the landscape version of your layout XML file in that directory.

Osbert answered 23/1, 2010 at 17:47 Comment(5)
Does that mean all activities need to define both a landscape and a portrait view if I do this?Trailblazer
No, if no layout-land definition exists it just uses the XML layout in the standard layout directory.Osbert
in my case , layout-land is not working when i am using , android:configChanges="orientation|keyboardHidden|screenSize"Souther
Remove orientation from android:configChanges="orientation|keyboardHidden|screenSize"Valora
When I change the orientation the activity does not switch the layout, staying with the layout when the activity is created. If I remove orientation from android:configChanges, the activity is destroyed.Orban
G
64

You just have to put it under separate folders with different names depending on orientation and resolution, the device will automatically select the right one for its screen settings

More info here:

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

under "Resource directory qualifiers for screen size and density"

Grogshop answered 23/1, 2010 at 17:52 Comment(3)
Only works for OS versions 1.6 or higher. If you want to support 1.5, you need this link: developer.android.com/guide/practices/screens-support-1.5.htmlPunctuate
@Silvio Donnini - links no longer have the required information.Cheslie
@Cheslie Yes it does: Go down to "Using configuration qualifiers"Sharpsighted
B
30

For Mouse lovers! I say right click on resources folder and Add new resource file, and from Available qualifiers select the orientation :

enter image description here


But still you can do it manually by say, adding the sub-folder "layout-land" to

"Your-Project-Directory\app\src\main\res"

since then any layout.xml file under this sub-folder will only work for landscape mode automatically.

Use "layout-port" for portrait mode.

Blip answered 17/9, 2016 at 14:45 Comment(1)
This worked for me. I added a new layout file as instructed with the same name as the portrait version. Android Studio automatically created a folder for that layout. One layout for portrait and another for landscape. The new layout automatically gets displayed when rotating screen.Fancy
D
25

Fastest way for Android Studio 3.x.x and Android Studio 4.x.x

1.Go to the design tab of the activity layout

2.At the top you should press on the orientation for preview button, there is a option to create a landscape layout (check image), a new folder will be created as your xml layout file for that particular orientation

enter image description here

Update: On newer versions the options have been moved to the context menu of the .xml filename button. (Big thanks to Oliver Hoffmann for pointing that out).

enter image description here

Dogwatch answered 16/7, 2019 at 6:1 Comment(3)
One of the easiest and Shortest way to deal with landscape layoutPhotomechanical
This answer should be chosenGordy
On newer AndroidStudio versions this option moved a bit to the context menu of the .xml filename buttonEmera
C
22

Just a reminder:

Remove orientation from android:configChanges attribute for the activity in your manifest xml file if you defined it:

android:configChanges="orientation|screenLayout|screenSize"
Coconut answered 30/10, 2013 at 9:19 Comment(2)
what if I need to have android:configChanges="orientation|screenLayout|screenSize" in my manifest, as some of my fragments can be in both orientation and some don't, but still need separate layouts for landscape and portrait for those fragments that can change orientation dynamically?Varietal
If I remove the orientation from android:configChanges the activity is destroyed when the orientation changes.Orban
P
6

I think the easiest way in the latest Android versions is by going to Design mode of an XML (not Text).

Then from the menu, select option - Create Landscape Variation. This will create a landscape xml without any hassle in a few seconds. The latest Android Studio version allows you to create a landscape view right away.

enter image description here

I hope this works for you.

Priorate answered 25/2, 2019 at 7:57 Comment(0)
C
4

Create a new directory layout-land, then create xml file with same name in layout-land as it was layout directory and align there your content for Landscape mode.

Note that id of content in both xml is same.

Childlike answered 23/4, 2016 at 11:22 Comment(0)
G
4

The last line below is an example for applying two quantifiers: landscape and smallest width(600dp) screen. Update 600dp with the ones you need.

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

The above applies to dimens as well

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

A useful device metrics: https://material.io/tools/devices/

Godson answered 26/2, 2019 at 17:26 Comment(0)
C
2

Or use this:

<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>
Chumley answered 15/4, 2013 at 0:34 Comment(0)
I
2
  1. Right click res folder,
  2. New -> Android Resource File
  3. in Available qualifiers, select Orientation,
  4. add to Chosen qualifier
  5. in Screen orientation, select Landscape
  6. Press OK

Using Android Studio 3.4.1, it no longer creates layout-land folder. It will create a folder and put two layout files together.

enter image description here

Inspector answered 9/6, 2019 at 2:46 Comment(1)
Incorrect. You are not using the folder view mode (like "Project"). You are probably using "Android" view mode, which groups files together like in your screenshot in virtual folders, but the actual folder structure is still how every other post here describes.Belenbelesprit
I
1

In Android Studio Chipmunk, the options you are looking for are here.

For landscape, the option is "Create Landscape Qualifier" in the XML name drop-down.
For different screen sizes, the option is "Create Tablet Qualifier"

these have been moved from previous Android Studio versions.

enter image description here

Source: https://mcmap.net/q/151973/-android-studio-where-is-the-button-to-39-create-landscape-variation-39-in-the-design-view

Incredulity answered 30/11, 2022 at 23:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.