最近在做一个项目。没有什么特别大的功能和难点。但是里面有很多判断和对于程序整个框架的设计有难度。接下来我每一章都总结一下项目中踩到的坑。
这次讲的是Fragment带来的坑
Fragment带参数启动。这个随便百度都能找得到。getter&setter,onActivityResult,Bundle, EventBus, Rxjava等等等等。
以上方法我没用过onActivityResult和rx。所以其他的方法我一个个说一下我踩的坑
首先要知道,Android其实是不建议开发者让Fragment之间相互通信的。具体为啥我也忘了(笑)。
EventBus:
如果用于Fragment和当前Fragment依赖的Activity通信的话还是可以的。如果同一个Activity下,使用同一容器的情况下,如果使用replace来切换Fragment。这样是接收不了信息的。除非使用粘性,但是使用了粘性还得想办法取消,否则新开的Fragment会一直接收前面的Fragment传来的信息。
如果使用hide show进行切换的话,没试过,但是目测应该是可以的。
Bundle:
Bundle的用法是通过根Activity作为中转,从FragmentA跳转到FragmentB的时候,把A的一些数据,通过接口的方式传到Activity实现的接口方法中,并在启动B之前通过SetBundle的方式放到B的单例实例中。
上个代码吧:
这个是B
public class B extends Fragment {
String mobile_tel, name;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mobile_tel = getArguments().getString("mobile_tel");
name = getArguments().getString("name");
return view;
}
B b
public static B newInstance(String... params) {
if (null == b) {
b= new B();
}
Bundle arg = new Bundle();
arg.putString("mobile_tel", params[0]);
arg.putString("name", params[1]);
pc2.setArguments(arg);
return b;
}
}
Activity接口:
String mobile = param[0];
String name = param[1];
b= B.newInstance(mobile, name);
showFragment(fm, b, true);
/**
* @param fm1 当前fragment
* @param fm2 需要show的fragment
* @param isAddToBackStack 是否加入退回栈
*/
private void showFragment(Fragment fm1, Fragment fm2, boolean isAddToBackStack) {
FragmentTransaction ft1 = getFragmentManager().beginTransaction();
if (fm1 != null) {
ft1.hide(fm1);
if (isAddToBackStack) {
ft1.addToBackStack(null);
}
}
if (!fm2.isAdded()) {
ft1.add(R.id.infomation_detail, fm2);
} else {
ft1.show(fm2);
}
ft1.commit();
}
至于A。。。不用写了吧?就一个接口把参数放进接口方法而已。
Bunlde方法适用于只需要在短时间内启动一次或者用replace来切换Fragment的情况下。
如果带Bundle启动的Fragment需要多次带参数启动的话,这个方法就不合适了。原因。。。。忘了。大概的意思是讲,Bundle启动的Fragment,Bundle只会启动一次,意思是说你这次放的参数是“A”, "B"。下次你再希望把参数放到Bundle里面来启动Fragment的话。Bundle是不干的。
最后 getter&setter:
这个方法看起来好像很不靠谱的样子。但是实际上好用的很。需要带参数多次启动的Fragment用起来毫无压力。怎么用?代码都不用放。
带参数的Fragment启动的是需要哪些参数,先写出来,然后getter&setter,在启动前通过接口获得参数,set进去,然后启动。这就OK了。hide show和replace一样可行。
下一章将会说说Fragment切换的坑。