1. 程式人生 > >Android中不同Activity間所託管的Fragment通訊的兩種方法

Android中不同Activity間所託管的Fragment通訊的兩種方法

Android開發中經常會使用Fragment開發,Fragment和其他Activity的通訊就會經常使用到,一般來說會有兩種通訊方法,下面詳細介紹。

方法一

眾所周知,Activity之間的通訊使用Intent,而第一種方法就是直接呼叫Fragment的方法getActivity()獲得所託管Activity例項,就可以通過Activity的getIntent()方法獲得啟動該Acitvity的Intent,進而該Fragment就可以獲得Intent物件例項,可以得到Intent物件所攜帶的資訊。

Intent intent = getActivity().getIntent
(); String info = intent.getStringExtra("your info");

注意
該intent實際就是獲得Fragment託管Acitvity的intent物件
該程式碼是在Fragment中呼叫的
這一種方法邏輯簡單,操作也非常方便,但是有一個很大的缺陷,就是Fragment和該Activity綁定了,Fragment要獲取資訊就只能獲取該Activity的Intent,這樣就破壞了Fragment存在的意義—-靈活性

下面介紹第二種方法

方法二

該方法的主要思想是由Activity來管理傳過來的資訊,分配給相應的Fragment。因此,Fragment就需要相應的配置一個Bundle物件來儲存資料,並且該Bundle是和Fragment對應繫結的,Android在Fragment中提供了setArguments(Bundle args)

方法,用於將Bundle物件和Fragment繫結,但是,呼叫setArguments(Bundle args)時需要注意,必須在建立Fragment之後,託管給Activity之前完成,因此,一般約定在Fragment中新建如下方法:

/**
  * 該方法提供給Activity繫結Fragment時呼叫
  * @param name 由Activity傳入需要通訊的資料,可以自己根據實際情況定義
  * @return 返回該Fragment例項物件
  */
public static QueryFragment newInstance(String name) {
        Bundle args = new
Bundle(); QueryFragment fragment = new QueryFragment(); args.putString("name",name);//再此新增繫結的資料 fragment.setArguments(args); return fragment; }

在Activity中呼叫該方法

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_grade);

        name = getIntent().getStringExtra("name");//獲取啟動該Activity的Intent,其中儲存了需要通訊的資料

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentById(R.id.mygrade_activity);

        if (fragment == null){
            fragment = QueryFragment.newInstance(name);//呼叫newInstance方法,該方法保證了再託管Activity前繫結Bundle物件到Fragment,並且將需要通訊的資料存取該Bundle物件中
            fragmentManager.beginTransaction()
                    .add(R.id.mygrade_activity,fragment)
                    .commit();
        }
    }

最後,在Fragment中呼叫getArguments()方法獲得Bundle物件,程式碼如下:

Bundle bundle = getArguments();//獲得Fragment的Bundle物件
String name = bundle.getString("name");//從Bundle中獲得儲存的資料

使用該方法通訊時,資訊流程如下:
傳送方Fragment使用Intent該Intent儲存有需要通訊的資料啟動Acitvity該Activity託管接收方Fragment),Acitvity使用getIntent()方法獲得該Intent,取出該資料後呼叫接收方Fragment提供的newInstance中間的引數根據需要自己設定方法將資料傳入接收方Fragment繫結的Bundle中,最後,接收方Fragment呼叫getArguments()方法獲得Bundle物件,取出其中資料。
第二種方法雖然相對於第一種方法複雜,但是能很好的實現Fragment與Activity的分離,足夠靈活,推薦使用第二種方法。