Android戰(zhàn)紀(jì)之Fragmentation的使用(單Activity+多Fragment設(shè)計(jì))

單Activity+多Fragment設(shè)計(jì)(Fragmentation的使用)


本文介紹使用Fragmentation庫(kù)打造單Activity+多Fragment的App基礎(chǔ)架構(gòu):
Fragmentation庫(kù)提供了SupportActivity和SupportFragment兩個(gè)基礎(chǔ)類准验,通過(guò)分別繼承這兩個(gè)類遵馆,實(shí)現(xiàn)自己的業(yè)務(wù)尚困。


  • 導(dǎo)入依賴
// 在App級(jí)別的gradle中引入Fragment依賴
api 'me.yokeyword:fragmentation:1.2.7'
api 'me.yokeyword:fragmentation-swipeback:1.2.7'
  • 封裝BaseFragment
    自定義BaseFragment繼承自Fragmentation提供的SwipeBackFragment
    將BaseFragment改為抽象類饺谬,在具體業(yè)務(wù)中定義具體的頁(yè)面Fragment時(shí)就繼承這個(gè)類文判,實(shí)現(xiàn)它的抽象方法习劫,傳入布局忽肛,綁定視圖审轮。
public abstract class BaseFragment extends SwipeBackFragment{
    // 需要實(shí)現(xiàn)的設(shè)置layout的抽象方法
    public abstract setLayout();
    // 需要實(shí)現(xiàn)的綁定完界面之后的操作方法
    public abstract onBindView(@Nullable Bundle savedInstanceState, View rootView);
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
        View rootView = null;
        if (setLayout() instanceof Integer){
            rootView = inflater.inflate((Integer)setLayout(), container, false);    
        }else if(setLayout() instanceof View){
            rootView = (View)setLayout();
        }else{
            throw new ClassCastException("type must be int or view");
        }
        onBindView(@Nullable savedInstanceState, View rootView);
    }
    // 返回唯一的Activity實(shí)例
    public final ProxyActivity getProxyActivity(){
        return (ProxyActivity)_mActivity;
    }
}
  • 封裝ProxyActivity
    自定義ProxyActivity繼承自Fragmentation提供的SupportActivity
    同樣也是抽象類芥被,用來(lái)綁定自定義的Fragement到界面上
public abstract class ProxyActivity extends SupportActivity{
    // 需要實(shí)現(xiàn)的設(shè)置Fragment的方法
    public abstract BaseFragment setRootFragment();

    @override
    protected void onCreate(@Nullable Bundle saveInstanceState){
        super.onCreate(saveInstanceState);
        initContainer(saveInstanceState);
    }
    
    private void initContainer(@Nullable Bundle saveInstanceState){
        final ContentFrameLayout container = new ContentFrameLayout(this);
        // id要在res/vlues定義一個(gè)資源文件ids欧宜,再定義一個(gè)id值
        container.setId(R.id.fragment_container);
        setContentView(container);
        if (saveInstancesState==null){
            // 框架提供的綁定Fragment到Framelayout的方法
            loadRootFragment(R.id.fragment_container, setRootFragment());
        }
    }
    
    // 釋放一些資源
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.gc();
        System.runFinalization();
    }
}
  • 定義具體的MyFragment繼承自BaseFragment
public class MyFragment extends BaseFragment{
    @override
    public Object setLayout(){
        return R.layout.fragment_my;
    }
    
    @override
    public void onBindView(@Nullable Bundle savedInstanceState, View rootView){
        
    }
}
  • 把定義的MyFragment嵌入唯一的MyActivity實(shí)例
public class MyActivity extends ProxyActivity{
    @override
    public BaseFragment setRootFragment(){
        return new MyFragment();
    }
}
  • 其中Fragmentation中提供的跳轉(zhuǎn)方法

裝載根Fragment,即Activity內(nèi)的第一個(gè)Fragment

 loadRootFragment(int containerId, SupportFragment toFragment)

同級(jí)Fragment場(chǎng)景下的切換(類似底部導(dǎo)航欄之間切換Fragment)

showHideFragment(SupportFragment showFragment, SupportFragment hideFragment);

啟動(dòng)Fragment的方法

// 啟動(dòng)新的Fragment,啟動(dòng)者和被啟動(dòng)者是在同一個(gè)棧的
start(SupportFragment fragment)

// 以某種啟動(dòng)模式撕彤,啟動(dòng)新的Fragment
start(SupportFragment fragment, int launchMode)

// 啟動(dòng)新的Fragment鱼鸠,并能接收到新Fragment的數(shù)據(jù)返回
startForResult(SupportFragment fragment,int requestCode)

// 啟動(dòng)目標(biāo)Fragment,并關(guān)閉當(dāng)前Fragment
startWithPop(SupportFragment fragment)
  • 小結(jié)
    這樣就可以定義多個(gè)自己業(yè)務(wù)的Fragment繼承自BaseFragment,然后調(diào)用Fragmentation提供的方法羹铅,在唯一的實(shí)例Activity中進(jìn)行跳轉(zhuǎn)蚀狰。

  • 基于這個(gè)框架的仿電商導(dǎo)航欄,多Fragment切換
    點(diǎn)此鏈接到下一篇文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末职员,一起剝皮案震驚了整個(gè)濱河市麻蹋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焊切,老刑警劉巖扮授,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異专肪,居然都是意外死亡刹勃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門嚎尤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荔仁,“玉大人,你說(shuō)我怎么就攤上這事》α海” “怎么了次洼?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)遇骑。 經(jīng)常有香客問(wèn)我卖毁,道長(zhǎng),這世上最難降的妖魔是什么落萎? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任亥啦,我火速辦了婚禮,結(jié)果婚禮上模暗,老公的妹妹穿的比我還像新娘禁悠。我一直安慰自己念祭,他們只是感情好兑宇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粱坤,像睡著了一般隶糕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站玄,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天枚驻,我揣著相機(jī)與錄音,去河邊找鬼株旷。 笑死再登,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晾剖。 我是一名探鬼主播锉矢,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼齿尽!你這毒婦竟也來(lái)了沽损?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤循头,失蹤者是張志新(化名)和其女友劉穎绵估,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卡骂,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡国裳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了全跨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缝左。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盒使,到底是詐尸還是另有隱情崩掘,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布少办,位于F島的核電站苞慢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏英妓。R本人自食惡果不足惜挽放,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔓纠。 院中可真熱鬧辑畦,春花似錦、人聲如沸腿倚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敷燎。三九已至暂筝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硬贯,已是汗流浹背焕襟。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饭豹,地道東北人鸵赖。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拄衰,于是被迫代替她去往敵國(guó)和親它褪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容