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)
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的分離,足夠靈活,推薦使用第二種方法。