516_fragment不要用构造函数传参数





fragment不要用构造函数传参数






为什么fragment不能用构造函数传参数




我们可以看一下Fragment的源码


    public Fragment() {
    }


我们发现,fragment的构造函数是空的,
所以他和普通类的创建对象的方式不太一样




然后我们看
    public static Fragment instantiate(Context context, String fname) {
        return instantiate(context, fname, null);
    }


是instantiate这个方法创建了fragment对象






看看instantiate


            Class<?> clazz = sClassMap.get(fname);
            if (clazz == null) {
                // Class not found in the cache, see if it's real, and try to add it
                clazz = context.getClassLoader().loadClass(fname);
                if (!Fragment.class.isAssignableFrom(clazz)) {
                    throw new InstantiationException("Trying to instantiate a class " + fname
                            + " that is not a Fragment", new ClassCastException());
                }
                sClassMap.put(fname, clazz);
            }
            Fragment f = (Fragment)clazz.newInstance();
            if (args != null) {
                args.setClassLoader(f.getClass().getClassLoader());
                f.mArguments = args;
            }
            return f;






我们发现Fragment是用反射的方式创建的
而且有mArguments来控制参数
那么当然要用特定的方式来传递参数了




我们可以用bundle对象来传递参数
            Bundle bundle = new Bundle();
            bundle.putSerializable("entity", entity);
            fragment.setArguments(bundle);









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要创建带参数Fragment,可以通过在 Fragment 构造函数中传递参数,然后在 FragmentFactory 中使用这些参数来创建 Fragment 实例。下面是一个简单的示例代码: 首先,在 Fragment 中定义一个带参数构造函数: ``` public class MyFragment extends Fragment { private String mParam1; private int mParam2; public MyFragment(String param1, int param2) { mParam1 = param1; mParam2 = param2; } // 其他代码... } ``` 然后,在 FragmentFactory 中使用这些参数来创建 Fragment 实例: ``` public class MyFragmentFactory extends FragmentFactory { private String mParam1; private int mParam2; public MyFragmentFactory(String param1, int param2) { mParam1 = param1; mParam2 = param2; } @Override public Fragment instantiate(ClassLoader classLoader, String className) { if (className.equals(MyFragment.class.getName())) { return new MyFragment(mParam1, mParam2); } return super.instantiate(classLoader, className); } } ``` 最后,在 Activity 或 Fragment 中使用 FragmentManager 创建 Fragment 时,通过 setFragmentFactory 方法设置自定义的 FragmentFactory: ``` FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.setFragmentFactory(new MyFragmentFactory("param1", 2)); Fragment fragment = fragmentManager.getFragmentFactory().instantiate( getClassLoader(), MyFragment.class.getName()); ``` 这样就可以创建带参数Fragment 实例了。在这个例子中,我们使用自定义的 FragmentFactory 来创建 MyFragment 实例,并通过构造函数传递参数。在 FragmentFactory 中,我们通过重写 instantiate 方法来实现按照 className 创建对应的 Fragment 实例,并使用传递的参数来创建 Fragment 实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值