Fragment传值为什么要通过setArguments()和Fragment的生命周期

创建fragment不应该通过new的方式,  应该通过一下方式

在Fragment2中,新建一个函数:newInstance(String  text)来接收传过来的参数:

新建一个Fragment2实例,然后将参数通过SetArguments设置到其中;

    public static Fragment2 newInstance(String text) {
        Fragment2 fragment = new Fragment2();
        Bundle args = new Bundle();
        args.putString("param", text);
        fragment.setArguments(args);
        return fragment;
    }
然后在Fragment2的OnCreateView的时候再从arguments中获取参数:
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.fragment2, container, false);
        if (getArguments() != null) {
            String mParam1 = getArguments().getString("param");
            TextView tv =  (TextView)view.findViewById(R.id.textview);
            tv.setText(mParam1);
        }
        return view;
    }
在Fragment1中,在调起Fragmen2t时,通过调用newInstance函数来获取实例并传递参数:
public class Fragment1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment1, container, false);
        Button btn = (Button)view.findViewById(R.id.load_fragment2_btn);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(final View view) {
                Fragment2 fragment2 = Fragment2.newInstance("从Fragment1传来的参数");

                FragmentTransaction transaction = getFragmentManager().beginTransaction();
                transaction.add(R.id.main_layout, fragment2);
                transaction.addToBackStack(null);
                transaction.commit();
            }
        });
        return view;
    }
}
 
为什么Fragment传值需要通过setArguments()?setArguments方法必须在fragment创建以后,添加给Activity前完成。千万不要,首先调用了add,然后设置arguments。
因为如果Fragment以外销毁,最终会通过反射无参构造实例化一个新的Fragment,并且给mArguments初始化为原先的值,而原来的Fragment实例的数据都丢失了,并重新进行了初始化

通过上面的分析,我们可以知道Activity重新创建时,会重新构建它所管理的Fragment,原先的Fragment的字段值将会全部丢失,

但是通过Fragment.setArguments(Bundle bundle)方法设置的bundle会保留下来。所以尽量使用Fragment.setArguments(Bundle bundle)方式来传递参数

Fragment的生命周期:

 

onAttach:关联activity,与activity相互绑定。

onCreate:是fragment的onCreate,用来创建fragment。

onCreateView:是创建fragment的布局。

onActivityCreate:此时activity的onCreate已经走完,在此生命周期可以获取到activity对象,获取到activity中的资源。上面三个不能获取到activity资源

onStart:与activity绑定,和activity的onStart方法一起走。

onResume:与activity绑定,和activity的onResume方法一起走。

onPause:与activity绑定,和activity的onPause方法一起走。

onStop:与activity绑定,和activity的onStop方法一起走。

 

posted @ 2017-06-27 18:42  wlwqnj  阅读(1769)  评论(0编辑  收藏  举报