Issue
So I have a really basic layout where at the top of the screen there is an EditText and a Button. When someone hits the button, the EditText input is saved to a text view, then the EditText is hidden as well as the button. Here's my code for that:
public void setName(View view){
EditText editText = (EditText) findViewById(R.id.getUserName);
Button button = (Button) findViewById(R.id.setName);
TextView textView = (TextView) findViewById(R.id.displayName);
playerName = editText.getText().toString();
textView.setText(playerName);
editText.setVisibility(View.GONE);
button.setVisibility(View.GONE);
textView.setTextSize(40);
textView.setVisibility(View.VISIBLE);
}
Well when the screen is rotated, onCreate is called again, which looks like this:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_score_keeper);
// Identifies a textView
TextView textView = (TextView) findViewById(R.id.displayName);
// Hide that textView until later
textView.setVisibility(View.GONE);
// Set player name to default value
playerName = "Player Name";
// Set score to default value
score = 0;
}
The problem with this is that it loses the fact that I hid the EditText and the Button, and also hides the TextView again.
How can I keep all of those properties the same? (eg keep the text the same, the text size, the visibility of a View, etc); Is it possible to do with onSaveInstanceState?
Thanks guys.
OSFTW
Solution
You could definitely just do this on the Activity's savedInstanceState, but I'd also recommend (since this may be something you do in multiple locations) to just write a subclass of the View which also saves its visibility as state, for example:
public class VisibiitySaveTextView extends TextView {
//These are just keys to save and restore values from the state
private static final String SUPER_STATE = "super_state";
private static final String VISIBILITY = "visibility";
//Constructors
@Override
public Parcelable onSaveInstanceState () {
Bundle state = new Bundle();
//Piggyback off of the View's implementation and store that
//bundle of saved information in our container bundle
state.putParcelable(SUPER_STATE, super.onSaveInstanceState());
//Store the current visibility of the View in the saved state
state.putInt(VISIBILITY, getVisibility());
return state;
}
@Override
public void onRestoreInstanceState (Parcelable state) {
//state should always be an instance of Bundle since that's what
//we're saving, but check for safety
if (state instanceof Bundle) {
Bundle savedState = (Bundle)state;
//Set the visibility of the View to match the visibility that
//we retained in onSavedInstanceState(), falling back to the
//current visibility as default if no state was saved
setVisibility(savedState.getInt(VISIBILITY, getVisibility()));
//Pull out the superclass state we saved, and let the superclass
//handle restoring all of the other state
Parcelable superState = savedState.getParcelable(SUPER_STATE);
super.onRestoreInstanceState(superState);
} else {
//Nothing special to do here other than pass it up to the super
super.onRestoreInstanceState(state);
}
}
}
EDIT: Example for letting the Activity handle the state:
private static final String MY_EDIT_TEXT_VISIBILITY = "my_edit_text_visibility";
private static final String MY_TEXT_VIEW_VISIBILITY - "my_text_view_visibility";
private static final String MY_BUTTON_VISIBILITY - "my_button_visibility";
@Override
protected void onSaveInstanceState (Bundle outState) {
super.onSaveInstanceState(outState);
//Save the state of each of these. It's super important to add null checks here
//(which is why I prefer to let the View handle it) as in some cases this can
//get called after the Views have been destroyed.
if (myEditText != null) {
outState.putInt(MY_EDIT_TEXT_VISIBILITY, myEditText.getVisibility());
}
if (myTextView != null) {
outState.putInt(MY_TEXT_VIEW_VISIBILITY, myTextView.getVisibility());
}
if (myButton != null) {
outState.putInt(MY_BUTTON_VISIBILITY, myButton.getVisibility());
}
}
@Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//Check if we have saved state, and restore the visibility
//to all of the Views we care about
if (savedInstanceState != null) {
myEditText.setVisibility(savedInstanceState.getInt(MY_EDIT_TEXT_VISIBILITY, myEditText.getVisibility()));
myTextView.setVisibility(savedInstanceState.getInt(MY_TEXT_VIEW_VISIBILITY, myTextView.getVisibility()));
myButton.setVisibility(savedInstanceState.getInt(MY_BUTTON_VISIBILITY, myButton.getVisibility()));
}
}
Answered By - Kevin Coppock
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.