技術(shù)需求背景
APP應(yīng)用開(kāi)發(fā)離不開(kāi)多頁(yè)面之間的信息交互鹦赎,比如說(shuō)在現(xiàn)在被大量使用的Fragment恶复,一個(gè)應(yīng)用可能會(huì)有多個(gè)Acitivity,一個(gè)Activity下會(huì)有多個(gè)Fragment。
那么如何在這多個(gè)Activity or fragment下來(lái)進(jìn)行信息交互呢。再具體下
比如如下gif場(chǎng)景
左邊是一級(jí)菜單晨抡,右邊上面是二級(jí)菜單,然后篩選出商品內(nèi)容则剃。
結(jié)構(gòu)是耘柱,外面一個(gè)大的FragmentA,在它里面有兩個(gè)Fragment忍级,左邊是FragmentB帆谍,右邊是FragmentC。
我們要做一個(gè)像上圖那樣添加到購(gòu)物車(chē)的動(dòng)畫(huà)效果轴咱。
參考這篇文章http://www.reibang.com/p/d9a3ae9e806d,我就不詳細(xì)講動(dòng)畫(huà)效果如何實(shí)現(xiàn)了烈涮。
不過(guò)為了實(shí)現(xiàn)這種效果朴肺,我們肯定是需要兩個(gè)信息,點(diǎn)擊+這個(gè)按鈕的view對(duì)象坚洽,和購(gòu)物車(chē)這個(gè)view對(duì)象戈稿。
那么問(wèn)題來(lái)了,添加按鈕在FragmentC 而購(gòu)物車(chē)按鈕在FragmentA
我怎樣能同時(shí)獲得這兩個(gè)對(duì)象以及進(jìn)行處理讶舰?那我們得會(huì)寫(xiě)接口設(shè)置監(jiān)聽(tīng)了鞍盗,請(qǐng)看下面
如何寫(xiě)接口
1.在FragmentC寫(xiě)接口,因?yàn)槲覀兪窃贔ragmentC進(jìn)行點(diǎn)擊事件的跳昼。
public interface FragmentC_sendto_FragmentAListener{
sendClickEvent(View view);
}
接口名字寫(xiě)的長(zhǎng)了點(diǎn)般甲,大概意思就是這個(gè)接口寫(xiě)出了是為了把信息從FragmentC傳到FragmentA。
2.定義成員變量鹅颊,因?yàn)樾枰谔砑拥劫?gòu)物車(chē)的點(diǎn)擊事件上使用
private FragmentC_sendto_FragmentAListener mlistener;
3.定義一個(gè)方法敷存,讓FragmentC能給mlistener賦值
public void setFragmentC_sendto_FragmentAListener
(FragmentC_sendto_FragmentAListener mlistener){
this.mlistener= mlistener;
}
4.在添加購(gòu)物車(chē)+號(hào)按鈕的點(diǎn)擊事件中處理傳遞到FragmentC
addShopCart.setOnclickListener(new OnClickListener(View view){
//如果listner不為空
if(mlistener!=null){
mlistener.sendClickEvent(view);
}
));
就這樣FragmentC的接口寫(xiě)好了。
FragmentA實(shí)現(xiàn)接口堪伍,對(duì)FragmentC的點(diǎn)擊購(gòu)物車(chē)動(dòng)作進(jìn)行監(jiān)聽(tīng)
1. public class FragmentA implements FragmentC.FragmentC_sendto_FragmentAListener {
}
2.監(jiān)聽(tīng)別人是需要“有人”在FragmentC那邊的锚烦,還記得之前我們?cè)贔ragmentC定義了一個(gè)方法嗎——setFragmentC_sendto_FragmentAListener
在onCreatView()里面
setFragmentC_sendto_FragmentAListener(this);
這個(gè)this就是**implements FragmentC.FragmentC_sendto_FragmentAListener **
換個(gè)話(huà)來(lái)說(shuō)FragmentA把人安排到FragmentC監(jiān)聽(tīng)了觅闽。
3實(shí)現(xiàn)接口方法
@Override
public void sendClickEvent(View view) {
// 接受到FragmentC他點(diǎn)擊了+按鈕了
//傳過(guò)來(lái)的view就是那個(gè)被點(diǎn)擊的+號(hào)的對(duì)象
//在FragmentA 肯定能獲得購(gòu)物車(chē)的對(duì)象。
//....自己獲得兩個(gè)不同fragment的對(duì)象涮俄,可以對(duì)其各種操作了
// 來(lái)不及解釋了蛉拙,動(dòng)畫(huà)效果go go go!
}