Android 復雜界面開發實踐之 ViewController: 介紹

EllHeilman 8年前發布 | 17K 次閱讀 安卓開發 Android開發 移動開發

ViewControler 是一種界面開發組件化實現方式,利用它可以將一些復雜的 UI 界面開發組件化, 從而更好的組織代碼結構,從而提高開發效率,降低維護成本。

這里先放一張 ViewControler 示意圖,如下所示。

優點

  • 界面開發組件化,解決 Activity/Fragment 中 UI 代碼臃腫問題。
  • 靈活的 UI 開發,同一組件可用于多處,代碼重用。
  • 易維護,開發簡單。

使用方法

目前已經使用 ViewControler 完成了一個房屋詳情頁開發 demo ,你可以直接運行代碼,查看 demo 如何運行,下面是一般的使用流程。

1、根據業務需求,劃分 UI 組件

如下所示是一個示例的 UI 開發場景,這是一個房屋詳情頁面,

按照一般的開發方式,我們需要在 layout 中先寫好所有的布局,然后在對應的 Activity 中 實例化所有的 View 示例,然后請求數據后,把數據分別填充在不同的 View 上,最終完成這個界面的開發。

但是現在,我們利用 ViewControler 后,可以把這兒界面組件化,顯然我們可以把它分為四個 UI 組件。

  • 房屋圖片組件

  • 房屋信息組件

  • 房屋描述組件

  • 房屋評論組件

至于怎么劃分組件,完全取決于具體的 UI 情景,這里只是以一個房屋詳情頁進行舉例。

2、實現組件

只要劃分完組件后,接下來就是分別實現組件的過程,這里以評論組件位例進行介紹,這里命名為 HouseCommentViewControler。

所有的組件都可以通過繼承 ViewControler 實現, ViewControler 是一個抽象類,你只需要實現下面三個抽象方法即可。

  • resLayoutId()

  • onCreatedView(View view)

  • onBindView(T data)

resLayoutId

該方法指定該 ViewControler 對應的 layout ID。所以這里需要去根據具體的 UI 樣式去創建一個評論組件的 layout,然后在這里返回對應的 layout id。

onCreatedView(View view)

該方法是用于初始化 View 的一個方法,你可以在這里實例化對應組件內的所有 View,也可以在 這里對 View 做一些事件監聽等等。

onBindView(T data)

這個方法是最終進行數據綁定的地方。

ViewControler 是一個泛型類,這里的 T 是這個 ViewControler 對應的數據類型。對于評論組件,只是展示一列不同用戶的評價信息, 使用簡單的字符串集合即可,所以這里的 T 應該是 List .

示例

下面是 HouseCommentViewControler 的實現方式

//繼承 ViewControler
public class HouseCommentViewControler extends ViewControler<List<String>> 

//指定 layout id 
@Override
protected int resLayoutId() {
    return R.layout.detail_comment_layout;
}

// View 初始化
@Override
protected void onCreatedView(View view) {
    ButterKnife.bind(this,view);
}

// 綁定數據到 view
@Override
protected void onBindView(List<String> comments) {
    for (String comment:comments) {
        TextView view = new TextView(getContext());
        view.setBackgroundResource(R.color.bk_item);
        view.setText(comment);
        int padding = Utils.dp2px(16);
        view.setPadding(padding,padding,padding,padding);
        mLlContainer.addView(view);
    }
}

具體實現可查看對應 demo 中 HouseCommentViewControler 的 實現源碼

至此,評論組件的實現類 HouseCommentViewControler 已經開發完畢,剩下的其他組件開發方式都一樣。

下面是不同組件對應的實現類。

  • 房屋圖片組件 -> HousePhotoViewController

  • 房屋信息組件 -> HouseParamViewControler

  • 房屋描述組件 -> HouseDescViewControler

  • 房屋評論組件 -> HouseCommentViewControler

3、在 Activity 中配置組件

開發完成組件后,剩下的事就是在 Activity 中去組合這幾個組件了, 這里通過 Activity 中的一個容器 View 與組件關聯,所以這里需要在 Activity 中定義 一個容器 View,一般可以選擇一個垂直的 LinearLayout。

接下來首先需要實例化組件,接著將組件與 Activity 關聯,然后在合適的時機向組件填充數據,如下所示。

//定義組件實例
private ViewControler<List<String>> mHousePhotoViewController;
private ViewControler<HouseDetail.Param> mHouseParamViewControler;
private ViewControler<List<String>> mHouseCommentViewControler;
private ViewControler<String> mHouseDescViewControler;

//實例化組件
mHousePhotoViewController = new HousePhotoViewController(this);
mHouseParamViewControler = new HouseParamViewControler(this);
mHouseDescViewControler = new HouseDescViewControler(this);
mHouseCommentViewControler = new HouseCommentViewControler(this);

//模擬數據獲取操作
getData();

//數據獲取成功后向組件填充數據
private void fillData(HouseDetail detail) {
    mHousePhotoViewController.fillData(detail.photos);
    mHouseParamViewControler.fillData(detail.param);
    mHouseDescViewControler.fillData(detail.desc);
    mHouseCommentViewControler.fillData(detail.comments);
}

最終的實現結果如下

Android 復雜界面開發實踐之 ViewController: 介紹

總結

至此, 界面開發完成。

你會發現主界面中看不到任何具體 View 操作相關的代碼, 因為這些代碼都已經被分發到不同的 ViewController 中去了。如上圖所示,每一部分的開發邏輯都被分發到了不同的 ViewControler 中,這樣在后期在開發維護過程中,如果某一部分要修改一些邏輯或者 UI 結構,你只需要到對應的 ViewControler 中去進行修改即可,如果這個界面需要新增一個模塊,只需要新建一個 ViewControler 就可以靈活的添加新模塊。

你會發現,Activity\Fragment 很少做改動。一般的操作直接在對應的 ViewControler 中完成即可。這種方案極大的解決了 Activity 中 UI 邏輯代碼復雜的問題。總之,在特定的界面開發中使用這種組件化的開發模式后,后續的維護開發就會變得特別有條理,非常高效。

另外,由于示例的原因,這里的 View 結構看山去比較簡單,但是在實際開發中,你遇到的情況,View 會比這復雜很多,在越復雜的場景中,ViewControler 的威力也就越大。

 

 

來自:http://gudong.name/2016/11/06/viewcontroler-introduce.html

 

 本文由用戶 EllHeilman 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!