一般对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的问题
- List<Fragment> fragments = getParentFragment()
- .getFragmentManager().getFragments();
- Fragment faqFragment = FragmentFactory.getInstance()
- .newFragment("cn.hzgames.tvpartner.faq");
- // 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, faqFragment);
- ft.hide(fragments.get(fragments.size() - 1));
- ft.show(faqFragment);
上面那个list中的数据和在
- getParentFragment()
- .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();