本文為菜鳥窩作者蔣志碧的連載。“從 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