How to set entire application in portrait mode only?
Asked Answered
A

18

223

How do I set it so the application is running in portrait mode only? I want the landscape mode to be disabled while the application is running. How do I do it programmatically?

Aryl answered 19/7, 2011 at 10:35 Comment(0)
P
313

For any Android version

From XML

You can specify android:screenOrientation="portrait" for each activity in your manifest.xml file. You cannot specify this option on the application tag.

From Java

Other option is to do it programmatically, for example in an Activity base class:

@Override
public void onCreate(Bundle savedInstanceState) {
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

For Android 4+ (API 14+)

Last option is to do it with activity lifecycle listeners which is only available since Android 4.0 (API 14+). Everything happens in a custom Application class:

@Override
public void onCreate() {
    super.onCreate();  
    registerActivityLifecycleCallbacks(new ActivityLifecycleAdapter() {
        @Override
        public void onActivityCreated(Activity a, Bundle savedInstanceState) {
            a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    });
}

ActivityLifecycleAdapter is just a helper class you'll need to create which will be an empty implementation of ActivityLifecycleCallbacks (so you don't have to override each and every methods of that interface when you simply need one of them).

Peppard answered 19/7, 2011 at 10:38 Comment(9)
it is not working. it turns to landscape mode when i turned the device. and more thing in code i am using these setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); instructions for the progress bar. is any problem with these instructions?Aryl
it's working. one more thing don't put above two instructions in your coding part. it means it enables the sensor for changing the screen orientation.Aryl
-1: The asker specifically requested how to do it //programmatically//, and for the entire application (which leads me to believe they don't want to do it for each activity individually).Waffle
@jwir3, I disagree. "programming" isn't just writing code code, it's also all of the meta files, resources you use, working around idiosyncrasies of the IDE, etc. This is a good answer, fixes the issue and the OP marked it as correct so was apparently a sufficient answer for the original question.Jabberwocky
Edited the answer to make it exhaustive.Peppard
using the LifeCycleCallbacks method you will have a delay in activity launches when you hold your device in (what would normaly be) landscape mode. I guess it's because the devices returns to landscape mode briefly inbetween the activities and needs time to handle this. Setting orientation in manifest doesn't have this effect.Teno
@Teno That's true, maybe setting orientation for each Activity is a tedious work, however, it is the safest way out.Hallway
Setting android:screenOrientation="portrait" in the manifest is the best practice since you can set it in the main activity and you won't need to repeat it for each activity.Anorexia
How to setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); always. If I went out from app ex: settings screen, App changed portrait mode when auto rotation off only API version 27 and above. How to fix this issue?Speck
N
149

Yes you can do this both programmatically and for all your activities making an AbstractActivity that all your activities extends.

public abstract class AbstractActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

This abstract activity can also be used for a global menu.

Nelle answered 20/3, 2012 at 9:34 Comment(1)
Note: I believe that ActivityInfo.SCREEN_ORIENTATION_NOSENSOR should be the better answer because it is intended to leave the device in the default state because some devices do not have a Portrait orientation. However, 'nosensor' does NOT work for me, so @arcone's answer stands for me.Nathanaelnathanial
N
116

You can do this for your entire application without having to make all your activities extend a common base class.

The trick is first to make sure you include an Application subclass in your project. In its onCreate(), called when your app first starts up, you register an ActivityLifecycleCallbacks object (API level 14+) to receive notifications of activity lifecycle events.

This gives you the opportunity to execute your own code whenever any activity in your app is started (or stopped, or resumed, or whatever). At this point you can call setRequestedOrientation() on the newly created activity.

class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();  

        // register to be informed of activities starting up
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, 
                                          Bundle savedInstanceState) {

                // new activity created; force its orientation to portrait
                activity.setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            }

            ....

        });

    }
}
Nace answered 18/7, 2014 at 14:53 Comment(10)
Good solution. I just hate all the empty methods it results inNonlinearity
this is the only answer which addresses the question. One line to rule them all.Deviled
*One class to rule them all.Agenda
Damn I didn't even know such a thing was possible in Android! Awesome!!! Very handy.Binoculars
and never forget to add in manifest application root . android:name=".MyApp"Yippee
Seems like a good option. Is there any disadvantage in using this approachMcginnis
This approach calls the onCreate() of the activity twice.Angelynanger
The problem is when you hold device horizontally and start new activity, it appears in landscape orientation and then rotates to portrait. Looks like the only good way to lock full app in portrait orientation is to mark every acitivity in Manifest.Clientage
@Clientage check this answer https://mcmap.net/q/55662/-activity-orientation-changes-automatically-on-android for your problem when you hold device horizontally and start new activity, it appears in landscape orientation and then rotates to portrait.Adaurd
i am new. can anyone share this full code? when i am trying to apply this then getting errors. so i told.Hulton
H
47

You can set this in your manifest file..

android:name=".your launching activity name"
android:screenOrientation="portrait"

and you can also achive the same by writing the code in your class file like:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Horizontal answered 19/7, 2011 at 10:39 Comment(3)
@ naresh pls accept ans if u got any solution according to your need it will race your rating alsoHorizontal
This is really an easy (working) solution compared to the other solutions. It works for me with Kotlin.Cooperation
Is this in a per activity basis or for the whole application?Pinkie
S
25

Add android:screenOrientation="portrait" to the activity in the AndroidManifest.xml. For example:

<activity android:name=".SomeActivity"
    android:label="@string/app_name"
    android:screenOrientation="portrait">
Starshaped answered 19/7, 2011 at 10:41 Comment(1)
He said APPLICATION not activity.Grainger
A
10

Use:

android:screenOrientation="portrait" 

Just write this line in your application's manifest file in each activity which you want to show in portrait mode only.

Argentinaargentine answered 23/11, 2012 at 10:5 Comment(0)
O
8

Write this to your manifest file, for every activity:

android:screenOrientation="portrait" 
Overmantel answered 19/7, 2011 at 13:54 Comment(0)
S
3
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //setting screen orientation locked so it will be acting as potrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
}
Slowpoke answered 16/4, 2020 at 14:22 Comment(0)
A
2

As from Android developer guide :

"orientation" The screen orientation has changed — the user has rotated the device. Note: If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.

"screenSize" The current available screen size has changed. This represents a change in the currently available size, relative to the current aspect ratio, so will change when the user switches between landscape and portrait. However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device). Added in API level 13.

So, in the AndroidManifest.xml file, we can put:

<activity
            android:name=".activities.role_activity.GeneralViewPagerActivity"
            android:label="@string/title_activity_general_view_pager"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 
Aussie answered 16/7, 2015 at 3:53 Comment(0)
U
1

Adding <preference name="orientation" value="portrait" /> under <widget> in my config.xml worked for me.

(The other solutions either didn't work on my device, were overwritten during building or gave deprecation errors during the build process.)

Underbody answered 1/3, 2016 at 16:30 Comment(1)
Where is the said config.xml? What development platform are you referring to?Nonlinearity
K
1

in Manifest file which activity you want to use in "portrait" you must write these code in Activity tag

  android:screenOrientation="portrait" 

like this

         android:icon="@drawable/icon"
        android:name="com.zemkoapps.hd.wallpaper.AndroidGridLayoutActivity" 
        android:screenOrientation="portrait" >

but if u want screen in landscape use this code like this

android:screenOrientation="landscape"
Karaganda answered 27/7, 2016 at 9:19 Comment(0)
S
1

If anyone was wondering , how you could do this for your entire application without having to make all your activities extend a common base class in Kotlin , see the example below :

class InteractiveStoryApplication: Application() {
override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }

        override fun onActivityPaused(activity: Activity?) {
        }

        override fun onActivityResumed(activity: Activity?) {
        }

        override fun onActivityDestroyed(activity: Activity?) {
        }

        override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
        }

        override fun onActivityStarted(activity: Activity?) {
        }

        override fun onActivityStopped(activity: Activity?) {
        }
    })
}
}

and then you have to add your common base class in AndroidManifest like so:

<application android:allowBackup="true"
android:name=".InteractiveStoryApplication"
Stereotype answered 3/7, 2017 at 17:3 Comment(0)
H
1

You can do it in two ways .

  1. Add android:screenOrientation="portrait" on your manifest file to the corresponding activity
  2. Add setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); to your activity in `onCreate() method
Hoban answered 15/12, 2017 at 5:23 Comment(0)
R
0

Similar to Graham Borland answer...but it seems you dont have to create Application class if you dont want...just create a Base Activity in your project

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_base);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

And extend this class instead of AppCompatActivity where you want to use Potrait Mode

public class your_activity extends BaseActivity {}
Reinstate answered 2/7, 2018 at 11:49 Comment(0)
A
0

For Xamarin Users:

If you extends all your activities to a BaseActivity Just add:

this.RequestedOrientation = ScreenOrientation.Portrait;

This will resolve the problem. If you want any particular activity to be in landscape override this in OnActivityCreated. As:

this.Activity.RequestedOrientation = ScreenOrientation.Landscape;
Archaize answered 25/2, 2019 at 5:41 Comment(0)
G
0

Well, I tried every answer but it didn't work in older versions of android. So, the final solution is to add this code to every activity just above setContentView:

    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Gabar answered 13/7, 2021 at 15:53 Comment(0)
S
0

In kotlin -->

Use this in your Extends Application class fun onCreate()...

registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
        override fun onActivityCreated(p0: Activity, p1: Bundle?) {
            p0.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
        }

        override fun onActivityStarted(p0: Activity) {
        }

        override fun onActivityResumed(p0: Activity) {
        }

        override fun onActivityPaused(p0: Activity) {
        }

        override fun onActivityStopped(p0: Activity) {
        }

        override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
        }

        override fun onActivityDestroyed(p0: Activity) {
        }
    }

    )}
Scald answered 12/11, 2021 at 3:33 Comment(0)
W
-12

In your Manifest type this:

<activity
    android:screenOrientation="portrait"
    <!--- Rest of your application information ---!>
</activity>
Winch answered 31/7, 2014 at 14:42 Comment(2)
This doesn't add anything new that 3 year old answers haven't already said. You might consider deleting it. If you decide to edit your answer to include more information that distinguishes your answer from others, please @reply to me.Borosilicate
android:screenOrientation="portrait" can not be added to application tag, it must go inside activity tagBrookhouse

© 2022 - 2024 — McMap. All rights reserved.