標籤:
說到Android設計模式的MVC模式,估計很多人都是比較熟悉了,這裡深入瞭解一下MVC到底是怎麼回事,以ListView為例子講解。
一、深入理解MVC概念
MVC即Model-View-Controller。M:邏輯模型,V:視圖模型,C:控制器。
MVC模式下,系統架構的類庫被劃分為3種:模型(Model)、視圖(View)、控制器(Controller)。模型對象負責建立資料結構和相應的行為操作處理。視圖對象負責在螢幕上渲染出相應的圖形資訊展示給使用者看。控制器對象負責截獲使用者的按鍵和螢幕觸摸等事件,協調Model對象和View對象。
使用者與視圖互動,視圖接收並反饋使用者的動作;視圖把使用者的請求傳給相應的控制器,由控制器決定調用哪個模型,然後由模型調用相應的商務邏輯對使用者請求進行加工處理,如果需要返回資料,模型會把相應的資料返回給控制器,由控制器調用相應的視圖,最終由視圖格式化和渲染返回的資料,對於返回的資料完全可以增加使用者體驗效果展現給使用者。
一個模型可以有多個視圖,一個視圖可以有多個控制器,一個控制器也可以有多個模型。
(1)、模型(Model)
Model是一個應用系統的核心部分,代表了該系統實際要實現的所有功能處理。比如:在視頻播放器中,模型代表一個視頻資料庫及播放視頻的程式函數代碼;在拍照應用中,模型代表一個照片資料庫,及看圖片時的程式函數代碼。在一個電話應用中,Model代表一個電話號碼簿,以及撥打到電話和傳送簡訊的程式函數代碼。
Model在values目錄下通過xml檔案格式產生,也可以通過硬式編碼方式直接Java代碼產生。View和Model是通過橋樑Adapter來串連起來。
(2)、視圖(View)
View是軟體應用傳送給使用者的一個反饋結果。它代表軟體應用中的圖形展示、聲音播放、觸覺反饋等職責。視圖的根節點是應用程式的自身視窗。比如,視頻播放器中可能包含當前播放的畫面,這個畫面就是一個視圖。另一個視圖組件可能是該視頻的文字標題。再一個就是一些播放按鍵,比如:Stop、Start、Pause等按鈕。
View在layout目錄下通過xml檔案格式產生,用findViewById()擷取;也可以通過硬式編碼方式直接Java代碼產生。
(3)、控制器(Controller)
Controller在軟體應用負責對外來事件的響應,包括:鍵盤敲擊、螢幕觸摸、電話呼入等。Controller實現了一個事件隊列,每一個外來事件均在事件隊列中被唯一標識。架構依次將事件從隊列中移出並派發出去。
二、MVC典型例子的實現ListView
Android中最典型MVC是ListView,要顯示的資料是Model,介面中的ListView是View,控制資料怎樣在ListView中顯示是Controller。
(1)、通過硬式編碼方式直接Java代碼產生方式,這裡直接在注釋講解
public class ArrayAdapterActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//介面中的ListView是View,這裡通過硬式編碼方式直接Java代碼產生ListView listView = new ListView(this);// 控制資料怎樣在ListView中顯示是ControllerArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData());//View和Model是通過橋樑Adapter來串連起來。listView.setAdapter(adapter);setContentView(listView);// 點擊事件,Controller負責listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// position是從0開始的,擷取點擊item的內容Toast.makeText(ArrayAdapterActivity.this, getData().get(position), Toast.LENGTH_SHORT).show();}});}// 要顯示的資料Model,通過硬式編碼方式直接Java代碼產生private List<String> getData() {List<String> data = new ArrayList<String>();data.add("a");data.add("b");data.add("c");data.add("d");return data;}}
(2)、視圖View和模型Model取資源檔方式
先在res/layout檔案夾下建立檔案activity_arrayadapter.xml,可以看出只包含一個ListView,即視圖View
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:drawSelectorOnTop="false" /></LinearLayout>
在res/values檔案夾下的strings.xml添加一個字元數組,及模型Model
<?xml version="1.0" encoding="utf-8"?><resources> <string-array name="good"> <item>a</item> <item>b</item> <item>c</item> <item>d</item> </string-array></resources>
Activity代碼,在注釋中講解MVC模型使用
public class ArrayAdapterActivity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_arrayadapter);//介面中的ListView是View,View在layout目錄下通過xml檔案格式產生,用findViewById()擷取ListView listView = (ListView) findViewById(R.id.listview);// 控制資料怎樣在ListView中顯示是ControllerArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData());//View和Model是通過橋樑Adapter來串連起來。listView.setAdapter(adapter);// 點擊事件,Controller負責listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// position是從0開始的,擷取點擊item的內容Toast.makeText(ArrayAdapterActivity2.this, getData().get(position), Toast.LENGTH_SHORT).show();}});}// 要顯示的資料Model,Model在values目錄下通過xml檔案格式產生private List<String> getData() {List<String> data = new ArrayList<String>();Resources res =getResources();// 取xml檔案格式的字元數組String[] good=res.getStringArray(R.array.good);for(int i=0;i<good.length;i++){data.add(good[i]);}return data;}}
Android的MVC模式要在項目中慢慢理解,這樣才能理解透徹並活學活用。
到這裡基本介紹完了Android設計模式之MVC模型,若本文對您有協助請點“推薦”支援,若有什麼錯誤請指正留言,共同探討。
轉載請附上本文連結:http://www.cnblogs.com/liqw/p/4175325.html
Android 設計模式之MVC模式