Don't reload application when orientation changes

Android

Android Problem Overview


I simply need nothing to change when the screen is rotated. My app displays a random image when it first loads and rotating the device should not select another random image. How can I (simply) make this behavior stop?

Android Solutions


Solution 1 - Android

There are generally three ways to do this:

  1. As some of the answers suggested, you could distinguish the cases of your activity being created for the first time and being restored from savedInstanceState. This is done by overriding onSaveInstanceState and checking the parameter of onCreate.

  2. You could lock the activity in one orientation by adding android:screenOrientation="portrait" (or "landscape") to <activity> in your manifest.

  3. You could tell the system that you meant to handle screen changes for yourself by specifying android:configChanges="orientation|screenSize" in the <activity> tag. This way the activity will not be recreated, but will receive a callback instead (which you can ignore as it's not useful for you).

Personally I'd go with (3). Of course if locking the app to one of the orientations is fine with you, you can also go with (2).

Solution 2 - Android

Xion's answer was close, but #3 (android:configChanes="orientation") won't work unless the application has an API level of 12 or lower.

In API level 13 or above, the screen size changes when the orientation changes, so this still causes the activity to be destroyed and started when orientation changes.

Simply add the "screenSize" attribute like I did below:

<activity
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

Now, when you change orientation (and screen size changes), the activity keeps its state and onConfigurationChanged() is called. This will keep whatever is on the screen (ie: webpage in a Webview) when the orientation changes.

Learned this from this site: http://developer.android.com/guide/topics/manifest/activity-element.html

Also, this is apparently a bad practice so read the link below about Handling Runtime Changes:

http://developer.android.com/guide/topics/resources/runtime-changes.html

Solution 3 - Android

You just have to go to the AndroidManifest.xml and inside or in your activities labels, you have to type this line of code as someone up there said:

android:configChanges="orientation|screenSize"

So, you'll have something like this:

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

Hope it works!

Solution 4 - Android

<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

Just add android:configChanges="orientation|screenSize" in activity tab of manifest file.

So, Activity won't restart when orientation change.

Solution 5 - Android

It's my experience that it's actually better to just deal with the orientation changes properly instead of trying to shoehorn a non-default behavior.

You should save the image that's currently being displayed in onSaveInstanceState() and restore it properly when your application runs through onCreate() again.

Solution 6 - Android

This solution is by far the best working one. In your manifest file add

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

And in your activity class add the following code

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}

Solution 7 - Android

In manifiest file add to each activity this. This will help

android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
        

Solution 8 - Android

add android:configChanges="keyboardHidden|orientation|screenSize" for all the app activities tags in manifest.

Solution 9 - Android

Just add this to your AndroidManifest.xml

<activity android:screenOrientation="landscape">

I mean, there is an activity tag, add this as another parameter. In case if you need portrait orientation, change landscape to portrait. Hope this helps.

Solution 10 - Android

just use : android:configChanges="keyboardHidden|orientation"

Solution 11 - Android

As Pacerier mentioned,

android:configChanges="orientation|screenSize"

Solution 12 - Android

All above answers are not working for me. So, i have fixed by mentioning the label with screenOrientation like below. Now everything fine

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>

Solution 13 - Android

http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html

@Override
protected void onSaveInstanceState(Bundle b)
{
		super.onSaveInstanceState(b);
	String str="Screen Change="+String.valueOf(screenChange)+"....";
		Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
	screenChange=true;
   
}

Solution 14 - Android

Prevent Activity to recreated Most common solution to dealing with orientation changes by setting the android:configChanges flag on your Activity in AndroidManifest.xml. Using this attribute your Activities won’t be recreated and all your views and data will still be there after orientation change.

<activity
    android:name="com.example.test.activity.MainActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"/>

this is work for me

Solution 15 - Android

Save the image details in your onPause() or onStop() and use it in the onCreate(Bundle savedInstanceState) to restore the image.

EDIT:

More info on the actual process is detailed here http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle as it is different in Honeycomb than previous Android versions.

Solution 16 - Android

I dont know if the a best solution, but i describe it here:

First of all, you need certificate with you class Application of your app is in your manifest of this:

<application
    android:name=".App"
    ...

Second, in my class App i did like this:

public class App extends Application {
    public static boolean isOrientationChanged = false;

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

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }
    
}

Third, you need to set a flag to Orientation Change, in my case, I always set it when the previous activity within the app navigation is called, so only calling once when the later activity is created.

isOrientationChanged = false;

So every time I change the orientation of my screen in that context, I set it every time it changes this setting, it checks if there is a change in orientation, if so, it validates it based on the value of that flag.

Basically, I had to use it whenever I made an asynchronous retrofit request, which he called every moment that changed orientation, constantly crashing the application:

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

I don't know if it's the most elegant and beautiful solution, but at least here it's functional :)

Solution 17 - Android

Add this code after the onCreate ,method in your activity containing the WebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJimmy DView Question on Stackoverflow
Solution 1 - AndroidXionView Answer on Stackoverflow
Solution 2 - AndroidcorbinView Answer on Stackoverflow
Solution 3 - AndroidJosue RochaView Answer on Stackoverflow
Solution 4 - AndroidAiyaz ParmarView Answer on Stackoverflow
Solution 5 - AndroiddmonView Answer on Stackoverflow
Solution 6 - AndroidA RajView Answer on Stackoverflow
Solution 7 - AndroidJevgenij KononovView Answer on Stackoverflow
Solution 8 - AndroidOubaida AlQuraanView Answer on Stackoverflow
Solution 9 - AndroidEgorView Answer on Stackoverflow
Solution 10 - AndroidMasoud BanimahdView Answer on Stackoverflow
Solution 11 - AndroidDon LarynxView Answer on Stackoverflow
Solution 12 - AndroidBahuView Answer on Stackoverflow
Solution 13 - Androidanimesh shrivastavaView Answer on Stackoverflow
Solution 14 - Androidsourab maityView Answer on Stackoverflow
Solution 15 - Androidtechi.servicesView Answer on Stackoverflow
Solution 16 - Androidmichel566View Answer on Stackoverflow
Solution 17 - AndroidAmir AslamView Answer on Stackoverflow