Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Save state of activity when orientation changes android

Tags:

I have an aacplayer app and I want to save the state of my activity when orientation changes from portrait to landscape. The TextViews do not appear to be empty, I tried to freeze my textview using this:

android:freezesText="true" 

my manifest:

android:configChanges="orientation" 

I also tried this:

@Override     public void onConfigurationChanged(Configuration newConfig){         super.onConfigurationChanged(newConfig);         setContentView(R.layout.main2); 

So when orientation changes to landscape I can see my layout-land main2.xml, that works but my textview goes out and appears empty. Streaming music works great. I can listen to it when orientation changes, but the text inside textviews are gone each time I change the orientation of my device.

What should I do to fix this so I can save the state?

@Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState); .... .... 

Thank you very much.

like image 567
alexistkd Avatar asked Oct 23 '12 02:10

alexistkd


People also ask

How do I stop Android from restarting activity when changing orientations?

If you want the activity to not restart during screen orientation change, you can use the below AndroidManifest. xml. Please note the activity android:configChanges=”orientation|screenSize” attribute. This attribute makes the activity not restart when change screen orientation.

What happens when orientation changes Android?

When you rotate your device and the screen changes orientation, Android usually destroys your application's existing Activities and Fragments and recreates them. Android does this so that your application can reload resources based on the new configuration.

How do you change orientation when retaining data?

Another 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.


1 Answers

When your orientation changes, you don't have to manually change to the landscape layout file. Android does this automatically for you. When orientation changes, Android destroys your current activity and creates a new activity again, this is why you are losing the text.

There are 2 parts you need to do, assuming you want a separate layout for portrait and landscape.

  1. Assuming you have 2 XML layout files for portrait and landscape, put your main.xml layout file in the following folders:

    res/layout/main.xml <-- this will be your portrait layout
    res/layout-land/main.xml <-- this will be your landscape layout

    That's all you need to do, you don't have to touch the manifest file to modify android:configChanges="orientation" or override the onConfigurationChanged(). Actually, it's recommended you do not touch this for what you are trying to achieve.

  2. Now to save your text from the text view =) Lets assume your textview is named as MyTextView in your layout xml file. Your activity will need the following:

    private TextView mTextView; private static final String KEY_TEXT_VALUE = "textValue";  @Override protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    mTextView = (TextView) findViewById(R.id.main);    if (savedInstanceState != null) {       CharSequence savedText = savedInstanceState.getCharSequence(KEY_TEXT_VALUE);       mTextView.setText(savedText);    } }  @Override protected void onSaveInstanceState (Bundle outState) {     super.onSaveInstanceState(outState);     outState.putCharSequence(KEY_TEXT_VALUE, mTextView.getText()); } 

Basically, whenever Android destroys and recreates your Activity for orientation change, it calls onSaveInstanceState() before destroying and calls onCreate() after recreating. Whatever you save in the bundle in onSaveInstanceState, you can get back from the onCreate() parameter.

So you want to save the value of the text view in the onSaveInstanceState(), and read it and populate your textview in the onCreate(). If the activity is being created for the first time (not due to rotation change), the savedInstanceState will be null in onCreate(). You also probably don't need the android:freezesText="true"

You can also try saving other variables if you need to, since you'll lose all the variables you stored when the activity is destroyed and recreated.

like image 88
hiBrianLee Avatar answered Oct 12 '22 03:10

hiBrianLee