2.使用接口
接口可以實(shí)現(xiàn)兩個(gè)Fragment之間的通信,也可以實(shí)現(xiàn)Fragment和Activity之間的通信,這大概是用的比較多的一種方式,也是個(gè)人比較推薦的一種方式,使用接口來(lái)實(shí)現(xiàn)兩個(gè)Fragment之間通信,要通過(guò)宿主Activity中轉(zhuǎn)一下,如果是Fragment和宿主Activity通信則直接調(diào)用即可。首先在左邊的Fragment中定義一個(gè)接口:
public?interface?showPro?{
public?void?showProByName(String?name);
}
然后定義一個(gè)接口變量:
private?showPro?mCallback;
我們要在宿主Activity中實(shí)現(xiàn)這個(gè)接口,這樣當(dāng)Fragment調(diào)用onAttach方法時(shí)我們就可以實(shí)例化這個(gè)接口了:
@Override
public?void?onAttach(Activity?activity)?{
super.onAttach(activity);
if?(activity?!=?null)?{
mCallback?=?(showPro)?activity;
}
}
當(dāng)mCallback實(shí)例化之后,那么我們?cè)邳c(diǎn)擊列表中的某一項(xiàng)的時(shí)候就可以調(diào)用這里邊的showProByName方法了:
lv.setOnItemClickListener(new?OnItemClickListener()?{
@Override
public?void?onItemClick(AdapterView?parent,?View?view,
int?position,?long?id)?{
TextView?nameTV?=?(TextView)?view;
String?name?=?nameTV.getText().toString();
if?("**".equals(name))?{
mCallback.showProByName(name);
}
}
});
當(dāng)然,這個(gè)方法的具體實(shí)現(xiàn)在宿主Activity中,當(dāng)宿主Activity實(shí)現(xiàn)了showPro接口之后,接著就要實(shí)現(xiàn)它里邊的方法了:
public?class?MainActivity?extends?Activity?implements?showPro?{
private?ContentFragment?cf;
@Override
protected?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().hide();
cf?=?(ContentFragment)?getFragmentManager().findFragmentById(
R.id.content_fg);
}
@Override
public?void?showProByName(String?name)?{
cf.showPro(name);
}
}
我們?cè)诮涌诘姆椒ㄖ姓{(diào)用右邊Fragment中的showPro方法,并將當(dāng)前人名作為參數(shù)傳入,這個(gè)方法與1中相同,我就不貼代碼了。這個(gè)方法與1中介紹的方法相比,雖然有點(diǎn)麻煩,但是可以有效的解決在一個(gè)Fragment中拿不到另一個(gè)Fragment實(shí)例的問(wèn)題,具體應(yīng)用場(chǎng)景就是ViewPager中的Fragment之間通信。