fragment.setArguments

Fragment只有一个无参构造函数,并且要显式定义

用法

public static XxFragment newInstance(String text) {
XxFragment fragment = new XxFragment();
Bundle bundle = new Bundle();
bundle.putString(“name”, text);
//fragment保存参数,传入一个Bundle对象
fragment.setArguments(bundle);
return fragment;
}
}
setArguments方法的调用必须要在Fragment与Activity关联之前。 这句话可以这样理解,setArgument方法的使用必须要在FragmentTransaction的commit之前使用。

Activity重新创建时,会重新构建它所管理的Fragment,原先的Fragment的字段值将会全部丢失,但是通过Fragment.setArguments(Bundle bundle)方法设置的bundle会保留下来。所以尽量使用Fragment.setArguments(Bundle bundle)方式来传递参数

根据Android文档说明,当一个fragment重新创建的时候,系统会再次调用 Fragment中的默认构造函数。 注意这里:是 默认构造函数。

这句话更直白的意思就是:当你小心翼翼的创建了一个带有重要参数的Fragment的之后,一旦由于什么原因(横竖屏切换)导致你的Fragment重新创建。——-很遗憾的告诉你,你之前传递的参数都不见了,因为recreate你的Fragment的时候,调用的是默认构造函数。
对比

而使用系统推荐的 Fragment.setArguments(Bundle)来传递参数。就可以有效的避免这一个问题,当你的Fragment销毁的时候,其中的Bundle会保存下来,当要重新创建的时候会检查Bundle是否为null,如果不为null,就会使用bundle作为参数来重新创建fragment.

Activity 和 Fragment 的通信实例:
public class Del {
public static Bundle getBundle(Del.BaseDelegate delegate) {
Bundle bundle = new Bundle();
bundle.putParcelable(1, delegate);
return bundle;
}

public interface BaseDelegate extends Parcelable {
    @Override
    default int describeContents() {
        return 0;
    }
    @Override
    default void writeToParcel(Parcel dest, int flags) {}
}

public interface XXDelegate extends BaseDelegate {
    void onSuccess();
}

Activity:
public class Activity{
private MainFragment mMainFragment;

mMainFragment = MainFragment.newInstance(Del.getBundle(mMainDelegate));

private Del.XXDelegate mDelegate = new Del.LoginDelegate() {
    @Override
    public void onSuccess() {
        .....
    }
};

}

Fragment:
private Del.MainDelegate mDelegate;
public static aFragment newInstance(Bundle args) {
aFragment fragment = new aFragment();
fragment.setArguments(args);
return fragment;
}
mDelegate = getArguments().getParcelable(1);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值