Fragment带参数启动的坑

来源:互联网 发布:apche怎么使用php 编辑:程序博客网 时间:2024/06/08 07:58

最近在做一个项目。没有什么特别大的功能和难点。但是里面有很多判断和对于程序整个框架的设计有难度。接下来我每一章都总结一下项目中踩到的坑。

这次讲的是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切换的坑。


0 0