1463

In my Android application, when I rotate the device (slide out the keyboard) then my Activity is restarted (onCreate is called). Now, this is probably how it's supposed to be, but I do a lot of initial setting up in the onCreate method, so I need either:

  1. Put all the initial setting up in another function so it's not all lost on device rotation or
  2. Make it so onCreate is not called again and the layout just adjusts or
  3. Limit the app to just portrait so that onCreate is not called.
JJD
52.8k63 gold badges218 silver badges353 bronze badges
asked Jan 19, 2009 at 0:28
2
  • 4
    There is a rather complete explanation on how to retain long-running asynchronous tasks during activity configuration changes in this blog post too! Commented Jan 15, 2014 at 20:14
  • 3
    This is not a direct answer as others have answered already, but I invite you to have a look at LogLifeCycle to understand what happens in your android apps regarding to life cycles. Commented Aug 24, 2014 at 0:36

34 Answers 34

1
2
998

Using the Application Class

Depending on what you're doing in your initialization you could consider creating a new class that extends Application and moving your initialization code into an overridden onCreate method within that class.

Kotlin version

class MyApplicationClass: Application {
 @override fun onCreate() {
 super.onCreate()
 // Put your application initialization code here
 }
}

Java version

public class MyApplicationClass extends Application {
 @Override
 public void onCreate() {
 super.onCreate();
 // Put your application initialization code here
 }
}

The onCreate in the application class is only called when the entire application is created, so the Activity restarts on orientation or keyboard visibility changes won't trigger it.

It's good practice to expose the instance of this class as a singleton and exposing the application variables you're initializing using getters and setters.

NOTE: You'll need to specify the name of your new Application class in the manifest for it to be registered and used:

<application
 android:name="com.you.yourapp.MyApplicationClass"

Reacting to Configuration Changes

UPDATE: This is deprecated since API 13; see the recommended alternative

As a further alternative, you can have your application listen for events that would cause a restart – like orientation and keyboard visibility changes – and handle them within your Activity.

Start by adding the android:configChanges node to your Activity's manifest node:

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

Or for Android 3.2 (API level 13) and newer:

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

Then within the Activity override the onConfigurationChanged method and call setContentView to force the GUI layout to be re-done in the new orientation.

Kotlin version

@override fun onConfigurationChanged(newConfig: Configuration) {
 super.onConfigurationChanged(newConfig)
 setContentView(R.layout.myLayout)
}

Java version

@Override
public void onConfigurationChanged(Configuration newConfig) {
 super.onConfigurationChanged(newConfig);
 setContentView(R.layout.myLayout);
}
CPlus
5,13848 gold badges34 silver badges77 bronze badges
answered Jan 19, 2009 at 8:47
Sign up to request clarification or add additional context in comments.

9 Comments

I dont think the second approach works. I tried it; one Activity with a EditText. I wrote some text there, change orientation and the text was gone/reset.
Here's hoping we see an onRotate() method in the future. Having to even worry about things like this is—frankly—frustrating.
Note that the Android Dev Guide cautions against using this: Note: Using (android:configChanges) should be avoided and used only as a last-resort. Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change. In lieu, to persist data across rotation events, they seem to prefer using the onSaveInstanceState Bundle; or as @Jon-O mentions, onRetainNonConfigurationInstance.
I think you should add this update on 3.2 to your answer, it's quite important (just faced that problem) and it might get overlooked.
using android:configChanges saves me a ton of work, so I hate it when Google tells me only to use it as a last resort without explaining why. Give me a reason not to save a ton of work. Please.
|
193

Update for Android 3.2 and higher:

Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), you must include the "screenSize" value in addition to the "orientation" value. That is, you must declare android:configChanges="orientation|screenSize". 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).

From http://web.archive.org/web/20120805085007/http://developer.android.com/guide/topics/resources/runtime-changes.html

General Grievance
5,12039 gold badges40 silver badges60 bronze badges
answered Mar 3, 2012 at 21:56

4 Comments

Thanks for that clarification, since a comment above on this almost sent me off to look into it. I'm presently targeting API 8 and my code does not have screenSize on configChanges and can confirm that it works fine (without re-orienting) on the device I have that is running ICS.
Thanks for pointing this out, I had only android:configChanges="orientation|screenSize" set, and orientation switching was recreating my Activity, and for the life of me I couldn't figure out why!
Adding android:configChanges should only be used as a last resort. Consider using Fragments and setRetainInstance instead.
The key point is screenSize for Android 3.2 and higher, that solved my problem, Thank you!
137

Instead of trying to stop the onCreate() from being fired altogether, maybe try checking the Bundle savedInstanceState being passed into the event to see if it is null or not.

For instance, if I have some logic that should be run when the Activity is truly created, not on every orientation change, I only run that logic in the onCreate() only if the savedInstanceState is null.

Otherwise, I still want the layout to redraw properly for the orientation.

public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_game_list);
 if(savedInstanceState == null){
 setupCloudMessaging();
 }
}

not sure if this is the ultimate answer, but it works for me.

answered Aug 4, 2012 at 21:04

5 Comments

and where are u actually saving state?
this seems to work for me and it seems by far the simplest method. i notice you only got 4 ups for this (5 including mine) vs. 373 for the idea about subclassing Application, which to me seems far more complicated. is there any downside this this method?
This solution worked GREAT for me. i was able to Intent serverintent = new Intent(MainActivity.this, MessageListener.class); and startService(serverintent); to create a serverSocket = new ServerSocket(0xcff2); and Socket client = serverSocket.accept(); with a BufferedReader(new InputStreamReader(client.getInputStream())); and could rotate my android and keep the client/server connection active, yet have the GUI rotate. According to the manual, savedInstanceState gets initialized when the last activity is shut down.
I don't understand, what's the catch? This works great, and with much less complexity than any of the other solutions.
This is the correct way to do it in Android. The other ways of basically catching a rotating with configChanges and all that are bulky, complex, and unnecessary.
104

what I did...

in the manifest, to the activity section, added:

android:configChanges="keyboardHidden|orientation"

in the code for the activity, implemented:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
 //get views from ID's
 this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);
 //etc... hook up click listeners, whatever you need from the Views
}
//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 InitializeUI();
}
//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
 super.onConfigurationChanged(newConfig);
 setContentView(R.layout.main);
 InitializeUI();
}
answered Jan 4, 2011 at 1:26

4 Comments

to clarify: with my implementation you can now have variable initialization in onCreate() and onConfigurationChanged() will simply be called for the screen rotation. Your variables are now insulated from screen rotations ;-) nice and ez
I did everything just as described here, but I get NullPointerException when I try to press a button after orientation change. What could be wrong?
keep in mind my answer is like 3 years old and Android keeps evolving... Simon - do you have a link to sample code? That's what people need.
When warning against android:configChanges, @SimonAndréForsberg is actually just paraphrasing the Android docs. Handling Runtime Changes has more detailed information on the alternatives (including sample code).
71

What you describe is the default behavior. You have to detect and handle these events yourself by adding:

android:configChanges

to your manifest and then the changes that you want to handle. So for orientation, you would use:

android:configChanges="orientation"

and for the keyboard being opened or closed you would use:

android:configChanges="keyboardHidden"

If you want to handle both you can just separate them with the pipe command like:

android:configChanges="keyboardHidden|orientation"

This will trigger the onConfigurationChanged method in whatever Activity you call. If you override the method you can pass in the new values.

Hope this helps.

answered Jan 19, 2009 at 2:28

1 Comment

@GregD I know, which is why now is a good time to update it to reflect the situation of today. Given the number of upvotes this question has, it is still being referred to from other questions on SO.
52

I just discovered this lore:

For keeping the Activity alive through an orientation change, and handling it through onConfigurationChanged, the documentation and the code sample above suggest this in the Manifest file:

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

which has the extra benefit that it always works.

The bonus lore is that omitting the keyboardHidden may seem logical, but it causes failures in the emulator (for Android 2.1 at least): specifying only orientation will make the emulator call both OnCreate and onConfigurationChanged sometimes, and only OnCreate other times.

I haven't seen the failure on a device, but I have heard about the emulator failing for others. So it's worth documenting.

Kaleem
1391 silver badge14 bronze badges
answered Dec 22, 2010 at 21:50

1 Comment

Caution: Beginning with Android 3.2 (API level 13), the "screen size" also changes when the device switches between portrait and landscape orientation. Thus, if you want to prevent runtime restarts due to orientation change when developing for API level 13 or higher: android:configChanges="orientation|keyboardHidden|screenSize"
40

You might also consider using the Android platform's way of persisting data across orientation changes: onRetainNonConfigurationInstance() and getLastNonConfigurationInstance().

This allows you to persist data across configuration changes, such as information you may have gotten from a server fetch or something else that's been computed in onCreate or since, while also allowing Android to re-layout your Activity using the xml file for the orientation now in use.

See here or here.

It should be noted that these methods are now deprecated (although still more flexible than handling orientation change yourself as most of the above solutions suggest) with the recommendation that everyone switch to Fragments and instead use setRetainInstance(true) on each Fragment you want to retain.

answered Sep 22, 2011 at 3:03

1 Comment

I really think Fragments and setRetainInstance is the best way (and recommended way by Google) to do this, +1 to you and -1 to all the others. Adding android:configChanges should only be used as a last resort
34

The approach is useful but is incomplete when using Fragments.

Fragments usually get recreated on configuration change. If you don't wish this to happen, use

setRetainInstance(true); in the Fragment's constructor(s)

This will cause fragments to be retained during configuration change.

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)

answered Sep 21, 2012 at 9:09

1 Comment

Agreed. With the latest Android API, it seems Fragments are the correct way to handle this. I haven't tried it yet myself, but from what I've gathered reading this page, you basically move 99% of what you used to implement in an Activity into a subclass of a Fragment, then add that Fragment to the Activity. The activity will still be destroyed and recreated on screen rotation, but you can specifically tell android not to destroy the Fragment using the setRetainInstance() method @Abdo mentioned.
27

I just simply added:

android:configChanges="keyboard|keyboardHidden|orientation"

in the AndroidManifest.xml file and did not add any onConfigurationChanged method in my activity.

So every time the keyboard slides out or in nothing happens! Also checkout this article about this problem.

SerjantArbuz
1,2941 gold badge17 silver badges22 bronze badges
answered Aug 9, 2012 at 9:58

Comments

21

The onCreate method is still called even when you change the orientation of android. So moving all the heavy functionality to this method is not going to help you

Piyush
18.9k5 gold badges35 silver badges64 bronze badges
answered Jan 21, 2010 at 10:40

Comments

21

Put the code below inside your <activity> tag in Manifest.xml:

android:configChanges="screenLayout|screenSize|orientation"
Praveen
7,2723 gold badges47 silver badges65 bronze badges
answered Aug 21, 2014 at 11:55

Comments

20

It is very simple just do the following steps:

<activity
 android:name=".Test"
 android:configChanges="orientation|screenSize"
 android:screenOrientation="landscape" >
</activity>

This works for me :

Note: orientation depends on your requitement

Ben Thomas
3,2082 gold badges22 silver badges39 bronze badges
answered Dec 14, 2015 at 6:39

Comments

19
onConfigurationChanged is called when the screen rotates. 
(onCreate is no longer called when the screen rotates due to manifest, see: 
android:configChanges)

What part of the manifest tells it "don't call onCreate()"?

Also, Google's docs say to avoid using android:configChanges (except as a last resort). But then the alternative methods they suggest all DO use android:configChanges.

It has been my experience that the emulator ALWAYS calls onCreate() upon rotation.
But the 1-2 devices that I run the same code on... do not. (Not sure why there would be any difference.)

Ramesh R
7,0874 gold badges27 silver badges40 bronze badges
answered Feb 1, 2012 at 15:55

Comments

17

Changes to be made in the Android manifest are:

android:configChanges="keyboardHidden|orientation" 

Additions to be made inside activity are:

public void onConfigurationChanged(Configuration newConfig) {
 super.onConfigurationChanged(newConfig);
 // Checks the orientation of the screen
 if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
 Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
 } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
 Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
 }
}
Mark Bell
29.8k26 gold badges122 silver badges150 bronze badges
answered Nov 11, 2011 at 12:20

Comments

17

Add this line to your manifest :-

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

and this snippet to the activity :-

@Override
 public void onConfigurationChanged(Configuration newConfig) {
 super.onConfigurationChanged(newConfig);
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
 WindowManager.LayoutParams.FLAG_FULLSCREEN);
 }
Pratik Butani
62.6k63 gold badges289 silver badges453 bronze badges
answered Jul 23, 2014 at 10:00

Comments

16

There are several ways to do this:

Save Activity State

You can save the activity state in onSaveInstanceState.

@Override
public void onSaveInstanceState(Bundle outState) {
 /*Save your data to be restored here
 Example: outState.putLong("time_state", time); , time is a long variable*/
 super.onSaveInstanceState(outState);
}

and then use the bundle to restore the state.

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 if(savedInstanceState!= null){
 /*When rotation occurs
 Example : time = savedInstanceState.getLong("time_state", 0); */
 } else {
 //When onCreate is called for the first time
 }
}

Handle orientation changes by yourself

Another alternative is to handle the orientation changes by yourself. But this is not considered a good practice.

Add this to your manifest file.

android:configChanges="keyboardHidden|orientation"

for Android 3.2 and later:

android:configChanges="keyboardHidden|orientation|screenSize"
@Override
public void onConfigurationChanged(Configuration config) {
 super.onConfigurationChanged(config);
 
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
 //Handle rotation from landscape to portrait mode here
 } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
 //Handle rotation from portrait to landscape mode here
 }
}

Restrict rotation

You can also confine your activity to portrait or landscape mode to avoid rotation.

Add this to the activity tag in your manifest file:

 android:screenOrientation="portrait"

Or implement this programmatically in your activity:

@Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Rahul
3,3392 gold badges35 silver badges44 bronze badges
answered Jan 7, 2016 at 18:55

Comments

12

The way I have found to do this is use the onRestoreInstanceState and the onSaveInstanceState events to save something in the Bundle (even if you dont need any variables saved, just put something in there so the Bundle isn't empty). Then, on the onCreate method, check to see if the Bundle is empty, and if it is, then do the initialization, if not, then do it.

Catalina
2,1481 gold badge18 silver badges25 bronze badges
answered Dec 21, 2012 at 20:15

Comments

12

Even though it is not "the Android way" I have gotten very good results by handling orientation changes myself and simply repositioning the widgets within a view to take the altered orientation into account. This is faster than any other approach, because your views do not have to be saved and restored. It also provides a more seamless experience to the user, because the respositioned widgets are exactly the same widgets, just moved and/or resized. Not only model state, but also view state, can be preserved in this manner.

RelativeLayout can sometimes be a good choice for a view that has to reorient itself from time to time. You just provide a set of portrait layout params and a set of landscaped layout params, with different relative positioning rules on each, for each child widget. Then, in your onConfigurationChanged() method, you pass the appropriate one to a setLayoutParams() call on each child. If any child control itself needs to be internally reoriented, you just call a method on that child to perform the reorientation. That child similarly calls methods on any of its child controls that need internal reorientation, and so on.

ra1ned
3495 silver badges21 bronze badges
answered Mar 16, 2012 at 9:13

1 Comment

I would love to see some sample code of this, seems brilliant !
10

Every time when the screen is rotated, opened activity is finished and onCreate() is called again.

1 . You can do one thing save the state of activity when the screen is rotated so that, You can recover all old stuff when the activity's onCreate() is called again. Refer this link

2 . If you want to prevent restarting of the activity just place the following lines in your manifest.xml file.

<activity android:name=".Youractivity"
 android:configChanges="orientation|screenSize"/>
Ramesh R
7,0874 gold badges27 silver badges40 bronze badges
answered Feb 3, 2017 at 10:47

Comments

8

you need to use the onSavedInstanceState method to store all the values to its parameter is has which is a bundle

@Override
 public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
 super.onSaveInstanceState(outState, outPersistentState);
 outPersistentState.putBoolean("key",value);
 }

and use

@Override
 protected void onRestoreInstanceState(Bundle savedInstanceState) {
 super.onRestoreInstanceState(savedInstanceState);
 savedInstanceState.getBoolean("key");
 } 

to retrieve and set the value to view objects it will handle the screen rotations

Ramesh R
7,0874 gold badges27 silver badges40 bronze badges
answered Dec 7, 2016 at 10:23

Comments

7

Note: I post this answer if someone in the future face the same problem as me. For me the following line wasn't enough:

android:configChanges="orientation"

When I rotated the screen, the method `onConfigurationChanged(Configuration new config) didn't get called.

Solution: I also had to add "screenSize" even if the problem had to do with the orientation. So in the AndroidManifest.xml - file, add this:

android:configChanges="keyboardHidden|orientation|screenSize"

Then implement the method onConfigurationChanged(Configuration newConfig)

Ramesh R
7,0874 gold badges27 silver badges40 bronze badges
answered Apr 24, 2014 at 14:40

Comments

6

In the activity section of the manifest, add:

android:configChanges="keyboardHidden|orientation"
Justin
25.7k12 gold badges98 silver badges145 bronze badges
answered Mar 10, 2017 at 8:14

Comments

6

People are saying that you should use

android:configChanges="keyboardHidden|orientation"

But the best and most professional way to handle rotation in Android is to use the Loader class. It's not a famous class(I don't know why), but it is way better than the AsyncTask. For more information, you can read the Android tutorials found in Udacity's Android courses.

Of course, as another way, you could store the values or the views with onSaveInstanceState and read them with onRestoreInstanceState. It's up to you really.

answered Jan 9, 2018 at 10:03

1 Comment

Yeah, let's add gobs of extra code to look "professional". Or how about just stick to the quick, easy, true and tried way of doing it with the configurationChanges attribute.
6

Add this line in manifest : android:configChanges="orientation|screenSize"

Agilarasan anbu
2,8252 gold badges31 silver badges33 bronze badges
answered Nov 28, 2017 at 12:42

Comments

5

One of the best components of android architecture introduced by google will fulfill all the requirements that are ViewModel.

That is designed to store and manage UI-related data in a lifecycle way plus that will allow data to survive as the screen rotates

class MyViewModel : ViewModel() {

Please refer to this: https://developer.android.com/topic/libraries/architecture/viewmodel

Ramesh R
7,0874 gold badges27 silver badges40 bronze badges
answered Oct 24, 2018 at 10:37

Comments

4

After a while of trial and error, I found a solution which fits my needs in the most situations. Here is the Code:

Manifest configuration:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.pepperonas.myapplication">
 <application
 android:name=".App"
 android:allowBackup="true"
 android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:supportsRtl="true"
 android:theme="@style/AppTheme">
 <activity
 android:name=".MainActivity"
 android:configChanges="orientation|keyboardHidden|screenSize">
 <intent-filter>
 <action android:name="android.intent.action.MAIN"/>
 <category android:name="android.intent.category.LAUNCHER"/>
 </intent-filter>
 </activity>
 </application>
</manifest>

MainActivity:

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 private static final String TAG = "MainActivity";
 private Fragment mFragment;
 private int mSelected = -1;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Log.d(TAG, "onCreate " + "");
 // null check not realy needed - but just in case...
 if (savedInstanceState == null) {
 initUi();
 // get an instance of FragmentTransaction from your Activity
 FragmentManager fragmentManager = getSupportFragmentManager();
 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
 /*IMPORTANT: Do the INITIAL(!) transaction only once!
 * If we call this everytime the layout changes orientation,
 * we will end with a messy, half-working UI.
 * */
 mFragment = FragmentOne.newInstance(mSelected = 0);
 fragmentTransaction.add(R.id.frame, mFragment);
 fragmentTransaction.commit();
 }
 }
 @Override
 public void onConfigurationChanged(Configuration newConfig) {
 super.onConfigurationChanged(newConfig);
 Log.d(TAG, "onConfigurationChanged " +
 (newConfig.orientation
 == Configuration.ORIENTATION_LANDSCAPE
 ? "landscape" : "portrait"));
 initUi();
 Log.i(TAG, "onConfigurationChanged - last selected: " + mSelected);
 makeFragmentTransaction(mSelected);
 }
 /**
 * Called from {@link #onCreate} and {@link #onConfigurationChanged}
 */
 private void initUi() {
 setContentView(R.layout.activity_main);
 Log.d(TAG, "onCreate instanceState == null / reinitializing..." + "");
 Button btnFragmentOne = (Button) findViewById(R.id.btn_fragment_one);
 Button btnFragmentTwo = (Button) findViewById(R.id.btn_fragment_two);
 btnFragmentOne.setOnClickListener(this);
 btnFragmentTwo.setOnClickListener(this);
 }
 /**
 * Not invoked (just for testing)...
 */
 @Override
 protected void onSaveInstanceState(Bundle outState) {
 super.onSaveInstanceState(outState);
 Log.d(TAG, "onSaveInstanceState " + "YOU WON'T SEE ME!!!");
 }
 /**
 * Not invoked (just for testing)...
 */
 @Override
 protected void onRestoreInstanceState(Bundle savedInstanceState) {
 super.onRestoreInstanceState(savedInstanceState);
 Log.d(TAG, "onSaveInstanceState " + "YOU WON'T SEE ME, AS WELL!!!");
 }
 @Override
 protected void onResume() {
 super.onResume();
 Log.d(TAG, "onResume " + "");
 }
 @Override
 protected void onPause() {
 super.onPause();
 Log.d(TAG, "onPause " + "");
 }
 @Override
 protected void onDestroy() {
 super.onDestroy();
 Log.d(TAG, "onDestroy " + "");
 }
 @Override
 public void onClick(View v) {
 switch (v.getId()) {
 case R.id.btn_fragment_one:
 Log.d(TAG, "onClick btn_fragment_one " + "");
 makeFragmentTransaction(0);
 break;
 case R.id.btn_fragment_two:
 Log.d(TAG, "onClick btn_fragment_two " + "");
 makeFragmentTransaction(1);
 break;
 default:
 Log.d(TAG, "onClick null - wtf?!" + "");
 }
 }
 /**
 * We replace the current Fragment with the selected one.
 * Note: It's called from {@link #onConfigurationChanged} as well.
 */
 private void makeFragmentTransaction(int selection) {
 switch (selection) {
 case 0:
 mFragment = FragmentOne.newInstance(mSelected = 0);
 break;
 case 1:
 mFragment = FragmentTwo.newInstance(mSelected = 1);
 break;
 }
 // Create new transaction
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
 // Replace whatever is in the fragment_container view with this fragment,
 // and add the transaction to the back stack
 transaction.replace(R.id.frame, mFragment);
 /*This would add the Fragment to the backstack...
 * But right now we comment it out.*/
 // transaction.addToBackStack(null);
 // Commit the transaction
 transaction.commit();
 }
}

And sample Fragment:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
 * @author Martin Pfeffer (pepperonas)
 */
public class FragmentOne extends Fragment {
 private static final String TAG = "FragmentOne";
 public static Fragment newInstance(int i) {
 Fragment fragment = new FragmentOne();
 Bundle args = new Bundle();
 args.putInt("the_id", i);
 fragment.setArguments(args);
 return fragment;
 }
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 Log.d(TAG, "onCreateView " + "");
 return inflater.inflate(R.layout.fragment_one, container, false);
 }
}

Can be found on github.

answered Oct 30, 2015 at 3:53

Comments

4

Use orientation listener to perform different tasks on different orientation.

@Override
public void onConfigurationChanged(Configuration myConfig) 
{
 super.onConfigurationChanged(myConfig);
 int orient = getResources().getConfiguration().orientation; 
 switch(orient) 
 {
 case Configuration.ORIENTATION_LANDSCAPE:
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
 break;
 case Configuration.ORIENTATION_PORTRAIT:
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
 break;
 default:
 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
 }
}
Piyush
18.9k5 gold badges35 silver badges64 bronze badges
answered Feb 4, 2015 at 6:58

Comments

4

Put this below code in your Activity in Android Manifest.

android:configChanges="orientation"

This will not restart your activity when you would change orientation.

Piyush
18.9k5 gold badges35 silver badges64 bronze badges
answered Jul 29, 2013 at 7:09

1 Comment

@Mavamaarten Probably because as others have pointed, it's bad pratice and ten other answers have already covered this.
4

Fix the screen orientation (landscape or portrait) in AndroidManifest.xml

android:screenOrientation="portrait" or android:screenOrientation="landscape"

for this your onResume() method is not called.

Piyush
18.9k5 gold badges35 silver badges64 bronze badges
answered Feb 15, 2013 at 11:14

1 Comment

how the hell fixing something is an answer? Why can our devices rotate if we lock users using it?
4

You may use the ViewModel object in your activity.

ViewModel objects are automatically retained during configuration changes so that the data they hold is immediately available to the next activity or fragment instance. Read more: https://developer.android.com/topic/libraries/architecture/viewmodel

Ramesh R
7,0874 gold badges27 silver badges40 bronze badges
answered Sep 19, 2018 at 16:24

Comments

1
2

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.