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

来源:互联网 发布:闪电精灵seo 编辑:程序博客网 时间:2024/05/29 16:25

一般对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() ,importantList<Fragment> fragments = getParentFragment().getFragmentManager().getFragments();// getParentFragment() ,importantFragmentTransaction 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();


0 0
原创粉丝点击