网站大量收购独家精品文档,联系QQ:2885784924

Android開发中如何正确保存view的状态.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android開发中如何正确保存view的状态

Android开发中如何正确保存view的状态? 本文是由国外资深开发转件对,Android开发中view的状态正确保存方法的一个深入介绍。为什么是对view的讲解,而不是对Activity 和 Fragment状态保存的讲解呢?是因为前者比后两者稍微复杂,且网上还有太多混淆开发者的讲解。 为什么我们需要保存View的状态? 因为,我坚信移动应用应该是帮助开发者解决问题,而不是制造问题。 想象一下一个非常复杂的设置页面: 这并不是从一个移动应用的截图(这不是典型的win32程序吗。。),但是适合用于说明我们的问题: 这里有非常多的文字输入控件,多选框,开关(switch)等等,你花了15分钟填完所有这些格子,总算轮到点击完成按钮了,但是突然,你不小心旋转了下屏幕,omg,所有的改动都没了,一切都回归到了初始状态。 当然,总有一些用户喜欢你的app简直到不行,不在乎重新填一次。但是老实说,这样做真的正确吗?别犯傻,你不尊重客户体验度,客户就不会喜欢你的APP,我们需要保存用户的修改。 如何保存View的状态? 假设我们这里有一个带有图像,文字和 Switch toggle控件的简单布局: LinearLayout xmlns:android=/apk/res/android android:layout_width=match_parent android:layout_height=match_parent android:orientation=horizontal android:padding=@dimen/activity_horizontal_margin ImageView android:layout_width=wrap_content android:layout_height=wrap_content android:src=@drawable/ic_launcher/ TextView android:layout_width=0dip android:layout_weight=1 android:layout_height=wrap_content android:text=My Text/ Switch android:layout_width=wrap_content android:layout_height=wrap_content android:layout_margin=8dip/ /LinearLayout 看吧,非常简单的布局。但是当我们滑动一下switch开关然后旋转屏幕方向,switch又回到了原来的状态。 通常,安卓会自动保存这些View(一般是系统控件)的状态,但是为什么在我们的案例中不起作用了呢? 让我们先停下来,弄明白安卓是如何管理View状态的。这里是正常情况下保存与恢复的示意图: saveHierarchyState(SparseArrayParcelable container) - 当状态需要保存的时候被安卓framework调用,通常会调用dispatchSaveInstanceState() 。 dispatchSaveInstanceState(SparseArrayParcelable container) - 被saveHierarchyState()调用。 在其内部调用onSaveInstanceState(),并且返回一个代表当前状态的Parcelable。这个Parcelable被保存在container参数中,container参数是一个键值对的map集合。View的ID是加键Parcelable是值。如果这是一个ViewGroup,还需要遍历其子view,保存子View的状态。 Parcelable onSaveInstanceState() - 被 dispatchSaveInstanceState()调用。这个方法应该在View的实现中被重写以返回实际的View状态。 restoreHierarchyState(SparseArrayParcelable container) - 在需要恢复View状态的时候被android调用,作为传入的SparseArray参数,包含了在保存过程中的所有view状态。 dispatchRestoreInstanceState(Sp

文档评论(0)

cv7c8hj6b4I + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档