Activity 和 Fragment 之间的数据传递

1.activity传递数据给fragment
①使用bundle传递数据

>   MyFragment fragment = new MyFragment();  
>Bundle bundle = new Bundle();  
>bundle.putString("data", "Activity发送给MyFragment的数据");  
>fragment.setArguments(bundle);

然后在Fragment中的onCreatView方法中,通过getArgments()方法,获取到bundle对象,然后通过getString的key值拿到我们传递过来的值。
②在Activity中定义一个字段、然后添加set和get方法,
代码如下、mTitle就是要传递的参数、如果是传递对象、可以把mTitle换成一个对象。

public class MyActivity{ 
    private String mTitle; 
    public void setmTitle(string str){
         this.mtitle =str;
    public String getmTitle(){
         return mTitle; 
         } 
} 

fragment调用方法、需要注意的是在设值的时候要进行强转一下。

 ((MyActivity)getActivity()).getmTitle();

③使用newInstance传递数据

static MyFragment newInstance(String s){
        MyFragment myFragment = new MyFragment();
        Bundle bundle = new Bundle();
        bundle.putString("DATA",s);
        myFragment.setArguments(bundle);
        return myFragment;
    }
    //同样,在onCreatView中直接获取这个值
 @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_fragment,container,false);
        Bundle bundle = getArguments();
        String data = bundle.getString("DATA");
        tv = (TextView) view.findViewById(R.id.id_fm_tv);
        if(data != null){
            tv.setText(data);
        }
        return view;
    }

在宿主activity中,创建Fragment

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out);
        fragment1 = MyFragment.newInstance("这是第一个fragment");//这里只需要直接调用这个方法,就创建了一个fragment
        fragment2 = MyFragment.newInstance("这是第二个fragment");
        fragment3 = MyFragment.newInstance("这是第三个fragment");

2.fragment 传递数据给activity
两个类之间传值可以用get()/set()的方式。但是这样不灵活。最好的办法是用回调,或者观察者模式来实现。
Fragment和Activity是两个组件类,不能直接new来获取对象。所以用观察者模式比较合理。android系统里也大量使用这种方式来传值。
①回调
在fragment中定义一个内部回调接口,再让包含该fragment的activity实现该回调接口,这样fragment即可调用该回调方法将数据传给activity。
MyActivity extends 回调类,传递给fragment,fragment调用回调类方法,再由activity去实现回调类方法。
②观察者模式
见下节

3.fragment 之间获取数据
①通过共同的Activity传递

  这种方法是在Activity里面添加一个字段、来临时保存要一些值。在Activity中定义一个字段、然后添加set和get方法、代码如下、mTitle就是要传递的参数、如果是传递对象、可以把mTitle换成一个对象即可.
代码同1.2
② 通过bundle传递
可以使用bundle进行参数传递、这样在两个Fragment跳转的时候就可以带上参数了、同样也可以传递一个复杂的对象。

ft.hide(getActivity().getSupportFragmentManager().findFragmentByTag(""));
    DemoFragment demoFragment = new DemoFragment();  
    Bundle bundle = new Bundle();  
    bundle.putString("key", "这是方法二");  
    demoFragment.setArguments(bundle);  
    ft.add(R.id.fragmentRoot, demoFragment, SEARCHPROJECT);  
    ft.commit();  

在另外一个Fragment获取参数的方式只需要一个语句、key是自己定义的一个标识、参数的形式只要bundle能传递都可以实现

String string = getArguments().getString("key");  

引用一下Fragment与它的Activity之间进行数据交换的方式。
1.Fragment中通过getActivity()然后进行强制转化,调用Activity中的公有方法 ((XXXXActivity)getActivity()).fun();
2.Activity在切换Fragment的时候,通过setArguments向Fragment传递参数,Fragment通过getArguments();获得从activity中传递过来的值
3.Activity实现一个接口,Fragment在onAttach方法中,将该Activity转化为该接口,在需要调用的时候回调。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章