Android : Save fragment state and restore the view values - android

Hi iam trying to save the state of the fragment when one fragment is replaced with other fragment.
Consider in my Activity i have a fragmentA with textview-1 and textview-2. when i click on the textview-1 i am replacing fragmentA with fragmentB which has a list view.
Now when i click on the fragmentB list item iam getting the list value and updating the textview-1. same thing iam doing for textview-2 but when i return back, the textview-1 value is gone. How to save the state of the fragment A and its textview-1 value.
Tried as below
#Override
public void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putString("curChoice", strtext);
}
and in OnActivityCreated()
if (savedInstanceState != null) {
// Restore last state for checked position.
strtext = savedInstanceState.getString("curChoice", "");
//incrementdata(strtext);
}
But always the savedInstanceState is giving null.

When any Fragment is destroyed by the system, everything will just happen exactly the same as in an Activity. It means that every single member variables are also destroyed with the fragment. You will have to manually save and restore those variables through the onSaveInstanceState and onActivityCreated methods respectively.
There is no onRestoreInstanceState method inside a Fragment.
So you need to do something like as below code.
// These variable are destroyed along with Activity
private String var1,var2;
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("VAR1", var1);
outState.putString("VAR2", var2);
}
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
var1 = savedInstanceState.getInt("VAR1");
var2 = savedInstanceState.getString("VAR2");
}
Basically every single standard widget such as EditText, TextView, Checkbox and etc. are all already internally implemented those things. You may need to enable it for some View for example you have to set android:freezeText to true for TextView to use the feature.

Related

Save data between activity and fragment

I have a login activity in my application which has a method that adds a fragment on top of it using fragment manager. I have two EditText fields in the fragment (name and password).
However when I change the orientation on my device, the text that is written in the EditText fields is deleted. The two EditText fields have been given two unique ID's in the XML-file (which normally helps to save the information within them when the orientation is changed) but the value inside them isn't preserved when orientation changes. How do I preserve the values inside of the EditText fields in this case?
There's a lot of links about same question on Stackoverflow, check it.
But your response:
Inside Fragment class you have the onSaveInstanceState method, override it in your fragment and put (putString) in the bundle (from method params) the variables you want to save, in this case your texts written in your edittexts.
Later in onActivityCreated get the values and set them in your EditTexts.
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("name", etName.getText().toString());
outState.putString("password", etPassword.getText().toString());
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
String name = savedInstanceState.getString("name", "");
String pass = savedInstanceState.getString("password", "");
etName.setText(name);
etPassword.setText(pass);
}
}

How to save the fields data while changing the Layout on screen rotation

I have read a lot of things about the data save instance and restore but Unable to implement in my case. What is my case in application .
I am using the Activity (MainActivity) and calling the fragment in it let say ParentFragment
ParentFragment Calls the ChildFragment in it though ParentFragment has its own views such as TextViews which takes First name, Last name and age and below this part I am programatically calling the ChildFragment
So in this way I have 2 fragments in the MainActivity, which is being shown to the user at a time on the screen
**What I want **
I want when User has change the orientation the layout should also change but I also want that the text fields should maintain there data in them .
I want to save some more fragment variables and their data also on configuration changes and retrieve them after the new layout is set after screen orientation changed.
**Problems and Confusions **
I have no idea If i set the Fragment.setRetainInstance(true) then would my fragment still be able to receive the onConfiguration Change call back?
When I rotate my device, the fragment gets re-initialize and also my activity has the Asynctask and that runs again , i want my activity to hold the same data . How can I achieve that?
Please help me and give me some hint.
If you want to change layout on orientation change then,you should not handle configuration change by retaining the activity(by setting android:configChanges="orientation" value for corresponding activity defined in manifest) or by using setRetainInstance() in fragment.
For saving the fragment state on configuration change use
#Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(FIRST_NAME_VALUE_KEY, firstNameTextView.getText());
outState.putInt(LAST_NAME_VALUE_KEY, lastNameTextView.getText());
super.onSaveInstanceState(outState);
}
and for writing back state to the views in fragment use
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_fragment, container, false);
if (savedInstanceState != null) {
String firstName = savedInstanceState.getInt(FIRST_NAME_VALUE_KEY);
String lastName = savedInstanceState.getInt(LAST_NAME_VALUE_KEY);
firstNameTextView.setText(firstName);
lastNameTextView.setText(lastName);
}
return view;
}
You will receive onConfigurationChanged() callback by retaining activity.it is not related to Fragment.setRetainInstance(true).
To avoid running asynctask again,We can store data and retain it using following callbacks inside the activity.
#Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
// Save custom values into the bundle
savedInstanceState.putInt(SOME_VALUE, someIntValue);
savedInstanceState.putString(SOME_OTHER_VALUE, someStringValue);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
  in onCreate(Bundle savedInstanceState) call back you can check for savedInstanceSate , based on that you can call u asynctask or retain values as below
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
asyncTask.execute();
} else {
someIntValue = savedInstanceState.getInt(SOME_VALUE);
someStringValue = savedInstanceState.getString(SOME_OTHER_VALUE);
}
}

How to restore state of android fragment where recyclerView has selected item

I have created a fragment where i used recyclerview and recyler items can be select/unselect . But problem is that when i move to other fragment and back to the same fragment then selected data lost .
How can i get the fragment as like previous condition where selected items will be at selected condition .
Try to use SaveInstanceState lets check one sample below
public class MainFragment extends Fragment {
// These variable are destroyed along with Activity
private int someVarA;
private String someVarB;
...
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("someVarA", someVarA);
outState.putString("someVarB", someVarB);
}
#Override
public void onActivityCreated(#Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
someVarA = savedInstanceState.getInt("someVarA");
someVarB = savedInstanceState.getString("someVarB");
}
}
There is no onRestoreInstanceState method inside Fragment.
For Fragment, there is some special case that is different from Activity and I think that you need to know about it. Once Fragment is returned from backstack, its View would be destroyed and recreated.

Page position on a ViewPager when change from portrait to landscape

I have a problem when I change from portrait to landscape orientation when programing a gallery. The page position in the method PageAdapter.instantiateItem(View container, int position) turns 0 when change the screen orientation. I want to store the current page position to keep in this page when the orientation changes.
You will need to store the currently displayed page in your saved instance state. For how to save state, please read the documentation.
#Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the current item
savedInstanceState.putInt("current_item", pager.getCurrentItem());
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
After an orientation change, that state can be restored and used to set your pagers position.
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentItem = savedInstanceState.getInt("current_item");
}
}
Call pager.setCurrentItem(mCurrentItem); e.g. in your onStart() or onResume() method.
For how to get and set the currently selected item read the ViewPager documentation:
getCurrentItem()
setCurrentItem()

Restoring displayed fragment on activity rotation

I have a fragment with one main fragment displayed on it. When I rotate the screen, the activity is beeing recreated. What would be the best way to store the info about currently displayed fragment for screen state restore purposes?
You can use the method onSaveInstanceState to store values in a bundle:
#Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(MY_FIRST_KEY,valueToSave);
}
then you can restore the values in the method onRestoreInstanceState
#Override
protected void onRestoreInstanceState(Bundle inState) {
super.onRestoreInstanceState(inState);
valueToSave = inState.getString(MY_FIRST_KEY);
}
You can also set an xml attribute on TextViews and EditText called "freezeText" which saves any text that was set.

Categories

Resources