Note that there are some explanatory texts on larger screens.

plurals
  1. POSaving dynamically added LinearLayouts without using savedInstanceState?
    text
    copied!<p>I have a layout in which I have dynamically added custom views at a push of a button. These layouts extend LinearLayout and each carry their own unique Action objects.</p> <p>The views will disappear, however, if onCreate is called again, when the user navigates away or rotates the screen. I want to keep these custom ActionHolder views there. To add to the problem, the ActionHolder objects contain sensitive information. The Action objects themselves store a live timer(that is supposed to keep on ticking even if the app is off), as well as other information.</p> <p>According to an answer below, I have done the following, but to no avail. Here is what I have so far:</p> <pre><code>public class ActionHolder extends LinearLayout implements Serializable { /** * */ private static final long serialVersionUID = 2271402255369440088L; private Action action; private String timer; public static final int ACTION_TITLE = 0, ACTION_TIMER = 1, PAUSEANDPLAY_BTN = 2, FINISH_BTN = 3; public ActionHolder(Context context) { super(context); } public ActionHolder(Context context, AttributeSet attr) { super(context, attr); } public ActionHolder(Context context, AttributeSet attr, int defStyle) { super(context, attr, defStyle); } public void initiate(Action input) { // int hashedID = input.getActionName().hashCode(); // if (hashedID &lt; 0) // hashedID *= -1; // this.setId(hashedID); this.setOrientation(LinearLayout.VERTICAL); this.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); action = input; LayoutInflater inflater = LayoutInflater.from(getContext()); View view = inflater.inflate(R.layout.action_holder_layout, this, true); TextView actionTitle = (TextView) view .findViewById(com.tonimiko.mochi_bean.R.id.action_holder_title); actionTitle.setText(action.getActionName()); actionTitle.setId(ActionHolder.ACTION_TITLE); TextView actionTimer = (TextView) view .findViewById(R.id.action_holder_timer); actionTimer.setId(ActionHolder.ACTION_TIMER); Button pauseBtn = (Button) view .findViewById(com.tonimiko.mochi_bean.R.id.pause_and_play_timer_btn); pauseBtn.setId(ActionHolder.PAUSEANDPLAY_BTN); Button finishBtn = (Button) view .findViewById(com.tonimiko.mochi_bean.R.id.finish_activity_button); finishBtn.setId(ActionHolder.FINISH_BTN); action.setActivityStartTime(); } public Action finishAction() { action.setActivityStopTime(); return action; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); } public String toString() { return "Action stored: " + action.getActionName(); } @Override public boolean equals(Object other) { ActionHolder otherObj = (ActionHolder) other; if (this.action.getActionName().toUpperCase() .equals(otherObj.action.getActionName().toUpperCase())) return true; return false; } @Override public int hashCode() { return action.getActionName().hashCode(); } @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); Bundle data = new Bundle(); data.putString("Timer", timer); data.putSerializable("Action", action); Log.e("debug", "View onSaveInstanceState called!"); // TODO Parcelable test = new ActionHolderSavedState(superState, data); if(test==null) Log.e("debug", "NULL PARCELABLE"); // TODO return new ActionHolderSavedState(superState, data); } @Override protected void onRestoreInstanceState(Parcelable state) { Log.e("debug", "View onRestore called!"); if (state instanceof ActionHolderSavedState) { final ActionHolderSavedState savedState = (ActionHolderSavedState) state; this.action = savedState.getAction(); this.timer = savedState.getTimer(); // this.initiate(action); super.onRestoreInstanceState(savedState.getSuperState()); Log.e("debug", "View onRestoreInstanceState finished"); // TODO } } static class ActionHolderSavedState extends BaseSavedState { private Action storedAction; private String storedTimer; public ActionHolderSavedState(Parcelable superState, Bundle data) { super(superState); storedTimer = data.getString("Timer"); storedAction = (Action) data.getSerializable("Action"); } private ActionHolderSavedState(Parcel in) { super(in); storedTimer = in.readString(); storedAction = in.readParcelable(ActionHolder.class.getClassLoader()); } public Action getAction() { return storedAction; } public String getTimer() { return storedTimer; } @Override public void writeToParcel(final Parcel out, final int flags) { super.writeToParcel(out, flags); out.writeString(storedTimer); out.writeSerializable(storedAction); } // required field that makes Parcelables from a Parcel public static final Parcelable.Creator&lt;ActionHolderSavedState&gt; CREATOR = new Parcelable.Creator&lt;ActionHolderSavedState&gt;() { public ActionHolderSavedState createFromParcel(final Parcel in) { return new ActionHolderSavedState(in); } public ActionHolderSavedState[] newArray(int size) { return new ActionHolderSavedState[size]; } }; } } </code></pre> <p>Is there SOMETHING I am doing wrong? I've spend almost 4 days already on this.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload