本文介绍了保存动态添加LinearLayouts不使用savedInstanceState?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我已经在按一下按钮动态添加自定义视图的布局。这些布局扩展的LinearLayout和各自携带自己独特的Action对象。

的意见将消失,但是,如果是的onCreate再次调用,当用户导航离开或旋转屏幕。我想保持这些自定义ActionHolder意见那里。为了增加问题,ActionHolder对象包含敏感信息。该行动对象本身存储的实时计时器(即应该保持在滴答作响,即使应用程序关闭时),以及其他信息。

根据下面的答案,我已经做以下,但无济于事。以下是我迄今为止:

 公共类ActionHolder扩展的LinearLayout实现Serializable {   / **
    *
    * /
   私有静态最后的serialVersionUID长= 2271402255369440088L;
   私人诉讼行动;
   私人字符串定时器;
   公共静态最终诠释ACTION_TITLE = 0,ACTION_TIMER = 1,
         PAUSEANDPLAY_BTN = 2,FINISH_BTN = 3;   公共ActionHolder(上下文的背景下){
      超级(上下文);
   }   公共ActionHolder(上下文的背景下,ATTR的AttributeSet){
      超(背景下,ATTR);
   }   公共ActionHolder(上下文的背景下,ATTR的AttributeSet,诠释defStyle){
      超(背景下,ATTR,defStyle);
   }   公共无效启动(动作输入){
      // INT hashedID = input.getActionName()哈希code();
      //如果(hashedID℃,)
      // hashedID * = -1;
      // this.setId(hashedID);
      this.setOrientation(LinearLayout.VERTICAL);
      this.setLayoutParams(新LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
      行动=输入;
      LayoutInflater充气= LayoutInflater.from(的getContext());
      查看查看= inflater.inflate(R.layout.action_holder_layout,这一点,真正的);      TextView的actionTitle =(TextView的)查看
            .findViewById(com.tonimiko.mochi_bean.R.id.action_holder_title);
      actionTitle.setText(action.getActionName());
      actionTitle.setId(ActionHolder.ACTION_TITLE);      TextView的actionTimer =(TextView的)查看
            .findViewById(R.id.action_holder_timer);
      actionTimer.setId(ActionHolder.ACTION_TIMER);      按钮pauseBtn =(按钮)查看
            .findViewById(com.tonimiko.mochi_bean.R.id.pause_and_play_timer_btn);
      pauseBtn.setId(ActionHolder.PAUSEANDPLAY_BTN);      按钮finishBtn =(按钮)查看
            .findViewById(com.tonimiko.mochi_bean.R.id.finish_activity_button);
      finishBtn.setId(ActionHolder.FINISH_BTN);      action.setActivityStartTime();
   }   公益行动finishAction(){
      action.setActivityStopTime();
      返回行动;
   }   @覆盖
   保护无效onLayout(布尔变化,诠释L,INT T,INT R,INT B){
      super.onLayout(改,L,T,R,B);
   }   公共字符串的toString(){
      回归行动储存:+ action.getActionName();
   }   @覆盖
   公共布尔等于(对象除外){
      ActionHolder otherObj =(ActionHolder)等;
      如果(this.action.getActionName()。与toUpperCase()
            .equals(otherObj.action.getActionName()。与toUpperCase()))
         返回true;
      返回false;
   }   @覆盖
   公众诠释哈希code(){
      返回action.getActionName()哈希code()。
   }   @覆盖
   保护Parcelable的onSaveInstanceState(){
      Parcelable超级大国= super.onSaveInstanceState();
      捆绑数据=新包();
      data.putString(定时器,定时器);
      data.putSerializable(行动,行动);
      Log.e(调试,观叫的onSaveInstanceState!); // 去做
      Parcelable测试=新ActionHolderSavedState(超级大国,数据);
      如果(测试== NULL)
         Log.e(调试,空PARCELABLE); // 去做
      返回新ActionHolderSavedState(超级大国,数据);
   }   @覆盖
   保护无效onRestoreInstanceState(Parcelable状态){
      Log.e(调试,查看OnRestore中所谓的!);
      如果(州的instanceof ActionHolderSavedState){
         最后ActionHolderSavedState savedState =(ActionHolderSavedState)状态;
         this.action = savedState.getAction();
         this.timer = savedState.getTimer();
         // this.initiate(动作);
         super.onRestoreInstanceState(savedState.getSuperState());
         Log.e(调试,查看onRestoreInstanceState完成); // 去做
      }
   }   静态类ActionHolderSavedState扩展BaseSavedState {      私人诉讼storedAction;
      私人字符串storedTimer;      公共ActionHolderSavedState(Parcelable超级大国,捆绑数据){
         超(超状态);
         storedTimer = data.getString(计时器);
         storedAction =(动作)data.getSerializable(行动);
      }      私人ActionHolderSavedState(包裹中){
         超级(在);
         storedTimer = in.readString();
         storedAction = in.readParcelable(ActionHolder.class.getClassLoader());
      }      公益行动的getAction(){
         返回storedAction;
      }      公共字符串的getTimer(){
         返回storedTimer;
      }      @覆盖
      公共无效writeToParcel(最终包裹出来,最终诠释标志){
         super.writeToParcel(出,旗);
         out.writeString(storedTimer);
         out.writeSerializable(storedAction);
      }      //必填字段,使Parcelables并从包裹
      公共静态最终Parcelable.Creator< ActionHolderSavedState> CREATOR =新Parcelable.Creator< ActionHolderSavedState>(){         公共ActionHolderSavedState createFromParcel(以最终地块){
            返回新ActionHolderSavedState(中);
         }         公共ActionHolderSavedState [] newArray(INT大小){
            返回新ActionHolderSavedState【尺寸】;
         }
      };
   }
}

是不是我做错了什么?我已经花费近4天这一点。


解决方案

我有非常类似你的情况,与正在动态添加到屏幕和需要保存状态自定义视图时,该活动是由OS死亡,后来重建,例如。

我重写的onSaveInstanceState 在自定义视图。它需要返回一个 Parcelable 对象。关键是要创建一个扩展 BaseSavedState 和您的数据存储到该 Parcelable 自定义类。它看起来有点像这样的:

Also, don't forget to set IDs to your dynamically added views, so they get re-added to the View tree when you come back.

这篇关于保存动态添加LinearLayouts不使用savedInstanceState?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-27 12:58