Fragment带参数启动的坑

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值