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轉化爲該接口,在需要調用的時候回調。

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