【從 0 開始開發(fā)一款直播 APP】5.4 MVC 之 Fragment 交互實現(xiàn)滑動導航

本文為菜鳥窩作者蔣志碧的連載。“從 0 開始開發(fā)一款直播 APP ”系列來聊聊時下最火的直播 APP,如何完整的實現(xiàn)一個類"騰訊直播"的商業(yè)化項目


【從 0 開始開發(fā)一款直播 APP】5.1 MVP 完全解析 -- 實現(xiàn)直播登錄
【從 0 開始開發(fā)一款直播 APP】5.2 MVP 之 Fragment 交互實現(xiàn)滑動導航
【從 0 開始開發(fā)一款直播 APP】5.3 MVC 完全解析 -- 實現(xiàn)直播登錄
【從 0 開始開發(fā)一款直播 APP】5.4 MVC 之 Fragment 交互實現(xiàn)滑動導航


上一章講了 MVC 實現(xiàn)登錄功能,這一章講 MVC 實現(xiàn)主頁面展示,前面已經(jīng)實現(xiàn)了這個功能,現(xiàn)在結合 MVC 來講解。


MVC 之 Fragment 交互實現(xiàn)滑動導航

Controller

1、MVCMainController 對應于 MVCMainActivity

1、定義 MVCIMainController 抽象類,主要方法是 initFragment() — 初始化 FragmentTabHost。

2、定義 MVCMainController 類繼承 MVCIMainController 抽象類,實現(xiàn) initFragment() 方法(FragmentTabHost 數(shù)據(jù)綁定)的邏輯。

2、MVCLiveMainController 對應于 MVCLivaMainFragment

MVCLiveMainController 與 MVCLiveMainView 關聯(lián),并添加初始化 ViewPager 實現(xiàn)導航的數(shù)據(jù)的方法 initViewPager(View rootView)。

View

1、MVCMainActivity

1、定義 MVCBaseView 接口,將通用方法封裝到里面。

2、定義 MVCIMainView 抽象類,實現(xiàn) MVCBaseView 接口。MVCIMainView 關聯(lián) MVCMainController,并綁定 FragmentTabHost 完成數(shù)據(jù)顯示。

3、MVCMainActivity 繼承 MVCIMainView 抽象類及其抽象方法,完成 MVCMainController 的實例化以及調用 initFragment() 完成顯示 FragmentTabHost 的功能。

2、MVCLivaMainFragment

1、定義 MVCLiveMainView 抽象類繼承 BaseFragment 抽象類,關聯(lián) MVCLiveMainController,綁定 ViewPager 完成 Tab 的切換。

2、MVCLivaMainFragment 繼承 MVCLiveMainView,調用 MVCLiveMainView 中的方法最終完成導航顯示。

Model

看到上面運行效果圖中,數(shù)據(jù)就是圖片以及標題,還有 Fragment 等,直接在 View 定義。



類圖結合上面的文字說明幫助理解,下面開始創(chuàng)建 MVC 基本架構,下面是根據(jù)上面類圖創(chuàng)建的相關包以及接口和類,紅色矩形框中的是 MVCLiveMainFragment 以及 MVCMainActivity 展示數(shù)據(jù)要用到的類,下面一一進行講解。

注意:本章講解是基于前面的一篇文章進行講解,不做過多的介紹。
具體細節(jié)查看:【從 0 開始開發(fā)一款直播 APP】2.2 高層封裝之 Fragment -- 滑動導航

MVCMainActivity 數(shù)據(jù)展示

Controller 所有類實現(xiàn)

1、MVCIMainController

Controller 基類,用于綁定 View 和 Model 的邏輯方法封裝,initFragment() 用于初始化 FragmentTabHost,完成 底部導航封裝方法初步定義。

public abstract class MVCIMainController {
    protected MVCBaseView mBaseView;
    protected BaseActivity mContext;

    public MVCIMainController(MVCBaseView baseView,BaseActivity context) {
        this.mBaseView = baseView;
        this.mContext = context;
    }

    //初始化 FragmentTabHost
    protected abstract void initFragment();
}

2、MVCMainController

MVCMainController 繼承 MVCIMainController,實現(xiàn)其抽象方法,mIMainView.setModel() 方法在 MVCIMainView 類中有實現(xiàn)。結合 MVC 架構,C 層完成 V 層的綁定,以及 M 層數(shù)據(jù)傳遞的邏輯實現(xiàn)。

public class MVCMainController extends MVCIMainController{

    private MVCIMainView mIMainView;
    public MVCMainController(MVCIMainView mainView, BaseActivity context) {
        super(mainView,context);
        mIMainView = mainView;
    }

    @Override
    public void initFragment() {
        mIMainView.setModel();
    }
}

View 所有類實現(xiàn)

1、MVCBaseView

View 基類定義,封裝可能用到的通用方法。

public interface MVCBaseView {

    /**
     * 數(shù)據(jù)加載或耗時加載時界面顯示
     */
    void showLoading();

    /**
     * 數(shù)據(jù)加載或耗時加載完成時界面顯示
     */
    void dismissLoading();

    /**
     * 消息提示,如 Toast,Dialog等
     */
    void showMsg(String msg);
    void showMsg(int msgId);

    /**
     * 獲取Context
     * @return
     */
    Context getContext();
}

2、MVCIMainView

MVCIMainView 繼承 BaseActivity,實現(xiàn) MVCBaseView 接口。綁定 MVCMainController 以及 Model 數(shù)據(jù)展示的具體實現(xiàn)。這里是 FragmentTabHost 實現(xiàn)底部滑動的數(shù)據(jù)展示。

public abstract class MVCIMainView extends BaseActivity implements MVCBaseView {
    //Controller
    protected MVCMainController mMainController;
    //Model
    public FragmentTabHost mTabHost;
    protected final Class mFragmentArray[] = {MVCLivaMainFragment.class, PublishFragment.class, UserInfoFragment.class};
    protected int mImageViewArray[] = {R.drawable.tab_live_selector, R.drawable.tab_pubish_selector, R.drawable.tab_my_selector};
    protected String mTextViewArray[] = {"live", "publish", "mine"};
    
    //在 MVCMainController 方法中調用
    public void setModel(){
        mTabHost = obtainView(android.R.id.tabhost);
        mTabHost.setup(mContext,getSupportFragmentManager(), R.id.contentPanel);
        int fragmentCount = mFragmentArray.length;
        for (int i = 0; i < fragmentCount; i++) {
            TabHost.TabSpec tabSpec = mTabHost.newTabSpec(mTextViewArray[i]).setIndicator(getTabItemView(i,mImageViewArray));
            mTabHost.addTab(tabSpec, mFragmentArray[i], null);
            mTabHost.getTabWidget().setDividerDrawable(null);
        }
    }

    private View getTabItemView(int i,int imageViewArray[]) {
        View view;
        view = LayoutInflater.from(mContext).inflate(R.layout.tab_live, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.tab_icon);
        imageView.setImageResource(imageViewArray[i]);
        return view;
    }
}

3、MVCMainActivity

MVCMainActivity 繼承 MVCIMainView,最終完成底部導航在界面上的顯示。看到這里代碼很少,只有 MVCMainController 的初始化以及調用 initFragment() 方法完成最終顯示。

public class MVCMainActivity extends MVCIMainView{
    @Override
    protected void setActionBar() {
    }

    @Override
    protected void setListener() {
    }

    @Override
    protected void initData() {
    }

    @Override
    protected void initView() {
        mMainController = new MVCMainController(this,this);
        mMainController.initFragment();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_mvcmain;
    }


    @Override
    public void showLoading() {
    }

    @Override
    public void dismissLoading() {
    }

    @Override
    public void showMsg(String msg) {
    }

    @Override
    public void showMsg(int msgId) {
    }

    @Override
    public Context getContext() {
        return this;
    }
}

運行效果依然不變


上面的導航依然是基于 MVCLiveMainFragment

MVCLiveMainFragment 的數(shù)據(jù)展示

Controller 所有類實現(xiàn)

MVCLiveMainController

Controller 基類定義,綁定 MVCLiveMainView,mMainView.initViewPager(rootView);mMainView.initViewPagerData() 方法在 MVCLiveMainView 類中有實現(xiàn)。結合 MVC 架構,C 層完成 V 層的綁定,以及 M 層數(shù)據(jù)傳遞的邏輯實現(xiàn)。

public class MVCLiveMainController {

    private MVCLiveMainView mMainView;
    //初始化 ViewPager,完成上面導航的顯示
    public void initViewPager(View rootView){
        mMainView.initViewPager(rootView);
        mMainView.initViewPagerData();
    }

    public MVCLiveMainController(MVCLiveMainView mainView) {
        this.mMainView = mainView;
    }
}

View 所有類實現(xiàn)

1、MVCLiveMainView

MVCLiveMainView 繼承 BaseFragment,綁定 MVCLiveMainController,完成 ViewPager 頂部導航數(shù)據(jù)顯示的具體實現(xiàn),實例化 MVCLiveMainController。

public abstract class MVCLiveMainView extends BaseFragment {
    //Controller
    protected MVCLiveMainController mMainController;
    //Model
    private ViewPager mViewPager;
    private PagerSlidingTabStrip mTabStrip;
    private ArrayList<String> mTitles;
    private ArrayList<Fragment> mFragments;

    public MVCLiveMainView() {
        mMainController = new MVCLiveMainController(this);
    }

    public void initViewPager(View rootView) {
        mViewPager = (ViewPager) rootView.findViewById(R.id.viewpager);
        mTabStrip = (PagerSlidingTabStrip) rootView.findViewById(R.id.pager_sliding_tab_strip);
        mTabStrip.setTextColorResource(R.color.white);
        mTabStrip.setIndicatorColorResource(R.color.white);
        mTabStrip.setDividerColor(Color.TRANSPARENT);
 mTabStrip.setTextSize(rootView.getResources().getDimensionPixelSize(R.dimen.h6));
        mTabStrip.setUnderlineHeight(1);
        mViewPager.setCurrentItem(0);
    }

    public void initViewPagerData(){
        mTitles = new ArrayList<>();
        mFragments = new ArrayList<>();
        mTitles.add("最新");
        mTitles.add("最熱");
        mTitles.add("達人");
        mTitles.add("活力");
        mTitles.add("英雄聯(lián)盟");
        mTitles.add("王者榮耀");
        for (String s:mTitles){
            Bundle bundle = new Bundle();
            bundle.putString("title",s);
            mFragments.add(LiveListFragment.newInstance(bundle));
        }
        mViewPager.setAdapter(getAdapter());
        mTabStrip.setViewPager(mViewPager);
    }

    public FragmentStatePagerAdapter getAdapter() {
        return new PagerAdapter(mContext.getSupportFragmentManager(),mTitles,mFragments);
    }
}

2、MVCLivaMainFragment

MVCLivaMainFragment 繼承 MVCLiveMainView,最終完成頂部導航的展示。

public class MVCLivaMainFragment extends MVCLiveMainView {

    @Override
    protected void initData() {
    }

    @Override
    protected void setListener() {
    }

    @Override
    protected void initView(View rootView) {
        mMainController.initViewPager(rootView);
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_mvcliva_main;
    }
}

運行效果


針對 MVC 框架,要做到結構清晰,盡量多畫圖, 結合 MVC 架構中三者的關系根據(jù)具體需求調節(jié)實現(xiàn)類和方法。寫的有問題的地方還請大家踴躍留言幫助筆者改正。

【五一大促】菜鳥窩全場android項目實戰(zhàn)課程低至五折,更有價值33元的四款熱門技術免費領,17年初優(yōu)惠力度最大的一次活動,有意向的童鞋不要錯過
狂戳>>http://www.cniao5.com/hd/2017/51.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容