Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to retain EditText data on orientation change?

I have a Login screen which consists of 2 EditTexts for Username and Password. My requirement is that on orientation change , input data(if any) in EditText should remain as it is and a new layout should also be drawn. I have 2 layout xml files- one in layout folder and other in layout-land folder. I am trying to implement following 2 approaches but none of them is perfect:

(1) configChanges:keyboardHidden - In this approach, I don't provide "orientation" in configChanges in manifest file. So I call setContentView() method in both onCreate() and onConfigurationChanged() methods. It fulfills both my requirements. Layout is changed and input data in EditTexts also remains as it is. But it has a big problem :

When user clicks on Login button, a ProgressDialog shows until server-response is received. Now if user rotates the device while ProgressDialog is running, app crashes. It shows an Exception saying "View cannot be attached to Window." I have tried to handle it using onSaveInstanceState (which DOES get called on orientation change) but app still crashes.

(2) configChanges:orientation|keyboardHidden - In this approach, I provide "orientation" in manifest. So now I have 2 scenarios:

(a) If I call setContentView() method in both onCreate() and onConfigurationChanged(), Layout is changed accordingly but EditText data is lost.

(b) If I call setContentView() method in onCreate() , but not in onConfigurationChanged(), then EditText data is not lost but layout also not changes accordingly.

And in this approach, onSaveInstanceState() is not even called.

So I am in a really intimidating situation. Is there any solution to this problem? Please help. Thanx in advance.

like image 793
Yogesh Somani Avatar asked Sep 14 '12 08:09

Yogesh Somani


People also ask

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.


2 Answers

By default, Edittext save their own instance when changing orientation.

Be sure that the 2 Edittexts have unique IDs and have the same IDs in both Layouts.

That way, their state should be saved and you can let Android handle the orientation change.

If you are using a fragment, be sure it has a unique ID also and you dont recreate it when recreating the Activity.

like image 108
Yalla T. Avatar answered Sep 21 '22 19:09

Yalla T.


A better approach is to let android handle the orientation change. Android will automatically fetch the layout from the correct folder and display it on the screen. All you need to do is to save the input values of the edit texts in the onSaveInsanceState() method and use these saved values to initialize the edit texts in the onCreate() method.
Here is how you can achieve this:

@Override protected void onCreate (Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.login_screen);     ...     ...     String userName, password;     if(savedInstanceState!=null)     {         userName = savedInstanceState.getString("user_name");         password= savedInstanceState.getString("password");     }      if(userName != null)         userNameEdtTxt.setText(userName);     if(password != null)         passEdtTxt.setText(password); } 

>

@Override     protected void onSaveInstanceState (Bundle outState)     {         outState.putString("user_name", userNameEdtTxt.getText().toString());         outState.putString("password",  passEdtTxt.getText().toString());     } 
like image 27
karn Avatar answered Sep 21 '22 19:09

karn