Android组件:Fragment切换后保存状态
来源:互联网 发布:vb简单小游戏代码 编辑:程序博客网 时间:2024/05/22 10:22
http://blog.csdn.net/leelit/article/details/38776931
之前写的第一篇Fragment实例,和大多数人一开始学的一样,都是通过FragmentTransaction的replace方法来实现,replace方法相当于先移除remove()原来所有已存在的fragments,然后添加add()当前这个fragment。这就导致了一个问题,我们切换一次,然后再切换回来,相当于重新加载了这个fragment,原来的状态不复存在,这显然与我们的日常使用不符。想要保存切换后的状态,思路还是很简单的,我们先添加了若干fragments,切换后将所有fragments都隐藏hide(),并显示show()切换后的fragment即可。
实例:山寨微信
由于代码较长,这里只讲核心的部分,有兴趣的可以下载源码来看一下
public class MainActivity extends ActionBarActivity implements OnClickListener {private View weixinLayout, tongxunluLayout, faxianLayout, woLayout;private TextView weixinTv, tongxunluTv, faxianTv, woTv;private ImageView weixinIv, tongxunluIv, faxianIv, woIv;private Fragment1 fragment1;private Fragment2 fragment2;private Fragment3 fragment3;private Fragment4 fragment4;private FragmentManager fm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化initViews();fm = getFragmentManager();// 初识状态是显示微信weixinIv.setBackgroundResource(R.drawable.weixin2);weixinTv.setTextColor(getResources().getColor(R.color.green));showFragment(1);}void initViews() {// 注册各IamgeViewweixinIv = (ImageView) findViewById(R.id.weixin_iv);tongxunluIv = (ImageView) findViewById(R.id.tongxunlu_iv);faxianIv = (ImageView) findViewById(R.id.faxian_iv);woIv = (ImageView) findViewById(R.id.wo_iv);// 注册各TextViewweixinTv = (TextView) findViewById(R.id.weixin_tv);tongxunluTv = (TextView) findViewById(R.id.tongxunlu_tv);faxianTv = (TextView) findViewById(R.id.faxian_tv);woTv = (TextView) findViewById(R.id.wo_tv);// 注册各LayoutweixinLayout = (View) findViewById(R.id.weixin_layout);tongxunluLayout = (View) findViewById(R.id.tongxunlu_layout);faxianLayout = (View) findViewById(R.id.faxian_layout);woLayout = (View) findViewById(R.id.wo_layout);// 各Layout注册监听器weixinLayout.setOnClickListener(this);tongxunluLayout.setOnClickListener(this);faxianLayout.setOnClickListener(this);woLayout.setOnClickListener(this);}@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub// 当点击某个layout时,先清除状态,这里的状态指的是布局里面的图片和文字clearState();switch (arg0.getId()) {case R.id.weixin_layout:// 如果点的是微信,将微信布局的图片和文字的颜色变为绿色weixinIv.setBackgroundResource(R.drawable.weixin2);weixinTv.setTextColor(getResources().getColor(R.color.green));// 显示微信的fragmentshowFragment(1);break;case R.id.tongxunlu_layout:tongxunluIv.setBackgroundResource(R.drawable.tongxunlu2);tongxunluTv.setTextColor(getResources().getColor(R.color.green));showFragment(2);break;case R.id.faxian_layout:faxianIv.setBackgroundResource(R.drawable.faxian2);faxianTv.setTextColor(getResources().getColor(R.color.green));showFragment(3);break;case R.id.wo_layout:woIv.setBackgroundResource(R.drawable.wo2);woTv.setTextColor(getResources().getColor(R.color.green));showFragment(4);break;}}public void clearState() {// 未选中时的图片weixinIv.setBackgroundResource(R.drawable.weixin1);tongxunluIv.setBackgroundResource(R.drawable.tongxunlu1);faxianIv.setBackgroundResource(R.drawable.faxian1);woIv.setBackgroundResource(R.drawable.wo1);// 未选中时字体颜色weixinTv.setTextColor(getResources().getColor(R.color.black));tongxunluTv.setTextColor(getResources().getColor(R.color.black));faxianTv.setTextColor(getResources().getColor(R.color.black));woTv.setTextColor(getResources().getColor(R.color.black));}public void showFragment(int index) {FragmentTransaction ft = fm.beginTransaction();// 想要显示一个fragment,先隐藏所有fragment,防止重叠hideFragments(ft);switch (index) {case 1:// 如果fragment1已经存在则将其显示出来if (fragment1 != null)ft.show(fragment1);// 否则是第一次切换则添加fragment1,注意添加后是会显示出来的,replace方法也是先remove后addelse {fragment1 = new Fragment1();ft.add(R.id.content, fragment1);}break;case 2:if (fragment2 != null)ft.show(fragment2);else {fragment2 = new Fragment2();ft.add(R.id.content, fragment2);}break;case 3:if (fragment3 != null)ft.show(fragment3);else {fragment3 = new Fragment3();ft.add(R.id.content, fragment3);}break;case 4:if (fragment4 != null)ft.show(fragment4);else {fragment4 = new Fragment4();ft.add(R.id.content, fragment4);}break;}ft.commit();}// 当fragment已被实例化,就隐藏起来public void hideFragments(FragmentTransaction ft) {if (fragment1 != null)ft.hide(fragment1);if (fragment2 != null)ft.hide(fragment2);if (fragment3 != null)ft.hide(fragment3);if (fragment4 != null)ft.hide(fragment4);}}
当我们一开始把微信fragment的ListView下拉到如上图时,切换到通讯录fragment,然后再切换回去微信fragment,此时微信的ListView还是原来的状态,这是因为并非重新加载微信fragment,而是将其先hide起来,切换回来后再show出来。
引用上篇文章的fragment生命周期图:
如果是repalce方法,我们切换至当前fragment则进行红线以上的生命周期,切换到其他fragment后进行红线以下的生命周期。但是,如果我们使用hide()和show()的方法,切换至当前fragment依然进行红线以上的生命周期,切换到其他fragment后并没有进行其他生命周期,只是简单地隐藏了起来。这样应该很明了了吧。
源码:
http://download.csdn.net/detail/leelit/8179147
0 0
- Android组件:Fragment切换后保存状态
- Android组件:Fragment切换后保存状态
- Android组件:Fragment切换后保存状态
- 【Android】保存Fragment切换状态
- 【Android】保存Fragment切换状态
- 【Android】保存Fragment切换状态
- Android】保存Fragment切换状态
- 【Android】保存Fragment切换状态
- 【Android】保存Fragment切换状态
- 【Android】保存Fragment切换状态 FragmentPagerAdapter
- android fragment切换无法保存状态的一种解决方法
- android fragment+ FragmentTabHost+viewpager 切换状态不保存的问题
- Iwfu-保存Fragment切换时的UI状态/保存销毁Activity后再次进入的视图状态
- Fragment切换 保存状态(add show hide)
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)
- Android Fragment的子fragment之间切换保存状态遇到的坑
- android activity fragment状态切换
- Android切换Fragment保持状态
- Java dom4j解析RESTFull风格发布的WebService的xml文件
- 存储过程procedure+触发器triggger+游标cursor
- 建立两数据库之间的连接,跨数据库访问数据
- PHP与API开发的人
- CSUOJ 1102 多色块拼图(进制转换,脑洞略大)
- Android组件:Fragment切换后保存状态
- 产品粘性的用户自我感知
- 东莞南城东城最好的400电话办理公司选心网科技
- CSS 发明者 Håkon Wium Lie 访谈(三)
- spring 容器初始化 bean 和销毁前所做的操作
- mysql中int、bigint、smallint 和 tinyint的区别详细介绍
- Metadata操作手册
- 医疗美容整形 友情链接交换11.20
- Mysql:is not allowed to connect to this MySQL server