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

在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()?

因为如果Fragment以外销毁,最终会通过反射无参构造实例化一个新的Fragment,并且给mArguments初始化为原先的值,而原来的Fragment实例的数据都丢失了,并重新进行了初始化

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

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

Fragment的生命周期:

场景演示 : 切换到该Fragment

11-29 14:26:35.095: D/AppListFragment(7649): onAttach

11-29 14:26:35.095: D/AppListFragment(7649): onCreate

11-29 14:26:35.095: D/AppListFragment(7649): onCreateView

11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated

11-29 14:26:35.120: D/AppListFragment(7649): onStart

11-29 14:26:35.120: D/AppListFragment(7649): onResume

屏幕灭掉:

11-29 14:27:35.185: D/AppListFragment(7649): onPause

11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState

11-29 14:27:35.205: D/AppListFragment(7649): onStop

屏幕解锁

11-29 14:33:13.240: D/AppListFragment(7649): onStart

11-29 14:33:13.275: D/AppListFragment(7649): onResume

切换到其他Fragment:

11-29 14:33:33.655: D/AppListFragment(7649): onPause

11-29 14:33:33.655: D/AppListFragment(7649): onStop

11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView

切换回本身的Fragment:

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView

11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated

11-29 14:33:55.825: D/AppListFragment(7649): onStart

11-29 14:33:55.825: D/AppListFragment(7649): onResume

回到桌面

11-29 14:34:26.590: D/AppListFragment(7649): onPause

11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState

11-29 14:34:26.880: D/AppListFragment(7649): onStop

回到应用

11-29 14:36:51.940: D/AppListFragment(7649): onStart

11-29 14:36:51.940: D/AppListFragment(7649): onResume

退出应用

11-29 14:37:03.020: D/AppListFragment(7649): onPause

11-29 14:37:03.155: D/AppListFragment(7649): onStop

11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView

11-29 14:37:03.165: D/AppListFragment(7649): onDestroy

11-29 14:37:03.165: D/AppListFragment(7649): onDetach

时间: 2024-08-01 22:47:33

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

Fragment生命周期

Fragment是Android3.0时引入的用于解决大屏设备视图布局的一个组件.它应理解为片段或者直接就是一个块.Fragment是不能单独存在的,它必须依赖与Activity. 如何创建一个Fragment:需继承Fragment这个类,4.0之前可以使用V4兼容包的Fragment,4.0开始有单独的Fragment. 如果使用Fragment:通过以下代码加载 1 package com.baixd.app.framework.fragment; 2 3 import android.a

Android Fragment用法详解(1)--静态使用Fragment

Fragment,也就是碎片,本意是为了适配大屏幕的安卓设备而生的.但是出现后,很多安卓开发者都非常喜欢这个东西.这个东西很好用,但是也不是很容易用.下面我来来细细解说Android中的Fragment. 1.Fragment产生的缘由 运行Android的设备繁多,屏幕大小更是多种多样.针对不同屏幕尺寸,通常情况下,开发者都是先针对手机开发一套源代码,然后拷贝一份,修改布局以适应大屏幕设备,或平板,电视等.为了决解这样的麻烦,Google推出了Fragment.你可以把Fragment当成Ac

关于FragmentManager动态管理Fragment时Fragment生命周期的探究

Fragment是Android中的重要组件,在Android 3.0的时候添加进来. 关于Fragment的生命周期,我相信了解过的开发人员都应该把以下方法脱口而出:onAttach, onCreate, onCreateView, onViewCreated, onActivityCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach. 当Fragment以静态的方式,即通过在布局文件中以

Fragment生命周期总结

原文链接:http://www.php100.com/html/it/biancheng/2015/0120/8419.html 参考:http://blog.csdn.net/lmj623565791/article/details/37992017 Fragment是Android中的重要组件,在Android 3.0的时候添加进来. 关于Fragment的生命周期,我相信了解过的开发人员都应该把以下方法脱口而出:onAttach, onCreate, onCreateView, onVie

activity 向fragment 传值

activity 向fragment 传值,分两种情况. 1.当fragment在此activity 时 activity里面的代码部分: meFragment = new MeFragment(); // // //传递一个参数给me_fragment的详情页,让其显示当前用户的信息      Bundle data = new Bundle();      data.putString("tag", userNumber);      meFragment.setArguments

【android】activity、fragment传值例子

1:Activity篇 1.1向Activity传值 比如First要给Second传递参数,我们可以这样写,关键点在于putExtra.如果传递类的话,记得类实现Serializable接口 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("param1", "data1"); intent.putExtra("param2&quo

android中传递复杂参数,Activity之间通过Intent使用bundle,fragment之间和Activityty通过setArguments使用bundle

在Android开发中,Activity之间通过Intent使用bundle,fragment之间和Activityty通过setArguments使用bundle,对于一些简单的参数传递比较简单,而且方式也有多种,这个就不介绍了.在这里介绍一下复杂的参数传递,比如传递集合ArrayList,对象ArrayList<Object>. 无论是Activity之间参数传递,还是Fragment之间参数传递,或者是Activity与Fragment之间,都要使用Bundle,方式基本相同.Bundl

Android FragmentActivity 给Fragment传值

1.Fragment给Activity传值 定义一个在fragment 中 定义interface 监听器,让activity实现,并将activity的引用传递给fragment.即setListener 2.Activity给Fragment传值 Activity必然会持有Fragment的引用,所以,给Fragment定义一个方法,比如setValue(Object xxx);Activity中直接用fragment.setValue(obj)来传值. 综上所述,对象与对象直接数据的传递,

从activity向另一个activity中的fragment传值

============问题描述============ 例如我有两个activity1,和activity2 其中activity2有一个fragment 我通过intent从activity1跳转到activity2,如何把activity1中的值传到activity2中的fragment中呢 求具体代码 我试过在1中声明bundle然后用setArgument 然后在fragment中getArgument 但是还是报错 还是应该从2中setArgument?不太清楚 求指教 ======