在fragment中向另一个fragment传递数据时java.lang.IllegalStateException: Fragment already active

本文深入探讨了在Android应用中如何在Fragment之间传递数据,并解决了使用setArguments方法时出现的异常问题。同时,介绍了如何正确地获取和操作Fragment栈,以实现Fragment的正确显示和隐藏,从而实现页面的流畅过渡。

一般对fragment传递数据都会想到用setArguments(Bundle data)方法,不过是在activity还是在fragment中传递。

但是如果你在fragment调用setArgument方法时,eclipse会抛出java.lang.IllegalStateException: Fragment already active异常。


想想也知道,在一个framgent钟调用setArguments方法设置数据,不是自己给自己设置吗?所以会报错。


看到网上有人说用setter和getter方法,没太明白也没去深究,我觉得应该有一种简单粗暴的方法。。


后来查了一些资料,假设你要传递数据给它的那个目标Fragment名字是a,那么调用a.setArguments就可以了,不要在fragment里面直接调用setArguments。


另外,在上一篇blog中说到嵌套使用fragment的问题


  1. List<Fragment> fragments = getParentFragment()  
  2.         .getFragmentManager().getFragments();  
  3.   
  4. Fragment faqFragment = FragmentFactory.getInstance()  
  5.         .newFragment("cn.hzgames.tvpartner.faq");  
  6.   
  7. // getParentFragment() ,important  
  8. FragmentTransaction ft = getParentFragment()  
  9.         .getFragmentManager().beginTransaction();  
  10. ft.setCustomAnimations(R.anim.slide_in_right,  
  11.         R.anim.slide_out_left);  
  12.   
  13. ft.add(R.id.root_fragment, faqFragment);  
  14. ft.hide(fragments.get(fragments.size() - 1));  
  15. ft.show(faqFragment);  



上面那个list中的数据和在

  1. getParentFragment()  
  2.         .getFragmentManager()



里面的真实数据是相反的。

fragemeng也是用栈来存放顺序,从栈取数据放到list中的顺序应该是取栈顶的数据,然后放在list中的第一个。

在前者中取数据的顺序是从后往前,而在list中放数据的顺序是从前往后。

而我们知道,当前显示在屏幕上的那个fragment的位置应该是在前者的最后一个,因为前者存放fragment的顺序肯定是显示一个然后压栈,当fragment被新的fragment覆盖时,新的fragment被置于栈顶,旧的fragment被覆盖,所以被隐藏。

一句话,显示的那个fragment总是位于那个栈的栈顶的,所以我们如果想要正确的显示和隐藏fragment来达到替换显示fragment的效果的话,应该用下面的语句:

			// getParentFragment() ,important
			List<Fragment> fragments = getParentFragment().getFragmentManager()
					.getFragments();

			// getParentFragment() ,important
			FragmentTransaction ft = getParentFragment().getFragmentManager()
					.beginTransaction();
			ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left);

			ft.add(R.id.root_fragment, fragment);
			ft.hide(fragments.get(0));
			ft.show(fragment);
			ft.addToBackStack(null);
			ft.commit();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值