[Android]Android筆記-基本概念

  • 3423
  • 0
  • 2016-03-05

摘要:[Android]Android筆記-基本概念

這個筆記主要是閱讀了張益裕的Android Tutorial後的心得記錄。

基本概念

Resource管理

Andriod把文字,色彩,尺寸,Layout等資訊及中在Resource目錄中統一管理,這些Resource使用XML格式。這也是關注點分離的概念,Android把這些資訊當作Configuration,程式碼只負責商業邏輯、商業流程、邏輯運算。

因為把設定值都放在XML中,所以Android Studio的操作介面對Resource有充分的支援。

在處理UI時,例如設定某個Button的Text,可以透過編輯器的Design介面選擇String Resource的內容。也可以透過Text介面直接編輯XML的內容。其實UI也是XML格式的檔案,所以就是編輯XML的標籤或屬性。

處理程式碼時,就相對單純許多。因為許多Resource檔的內容都是使用在UI層,程式需要的Resource,通常就是Layout內的UI 元件。而會使用findViewById()透過Layout Resource的id來取得UI元件。如以下的程式碼:

ListView item_list = (ListView) findViewById(R.id.item_list);

事件處理

Andriod的事件處理可以有兩種設定方式:

第一個方式是直接在UI的Layout Resource中設定onClick這種屬性,對應到程式碼的同名method中

UI Layout:

<TextView 
    ...
    android:clickable="true"
    android:onClick="aboutApp" />

程式碼:

// 方法名稱與onClick的設定一樣,參數的型態是android.view.View
public void aboutApp(View view) {
    // 顯示訊息
    Toast.makeText(this, R.string.app_name, Toast.LENGTH_LONG).show();
}

第二個方式是透過Listener的方式,其實也就是Event機制,透過程式碼把處理邏輯的function()掛載在UI物件的Event上。兩者的差異是,上一個的Event掛載是寫在XML檔案中,而這一個Event掛載是寫在程式碼中-textViewObj.setOnClickListener(listener)

    // 取得在Layout中設定好的UI元件
    TextView textViewObj = (TextView) findViewById(R.id.show_app_name);

    // 建立OnClick Listener
    View.OnClickListener listener = new View.OnClickListener() { 
        @Override
        public void onClick(View view) {
            AlertDialog.Builder d = 
                new AlertDialog.Builder(MainActivity.this);
            d.setTitle(R.string.app_name)
             .setMessage(R.string.about)
             .show();
        } 
    };

    // 註冊點擊監聽物件
    textViewObj.setOnClickListener(listener);

View與Controller的連結

雖不像iOS有明顯的MVC規範,但Android其實也是把ViewController分離出來。所以在Controller中編寫程式的時候,還是需要另外透過id找到UI物件,然後再對該UI物件進行操作。

所以可以採取這樣的作法,先建立一個function processViews()以執行取得畫面元件的工作,然後才繼續執行其他的初始化動作。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(...);

    // 呼叫自己額外宣告的方法,執行所有取得畫面元件物件的工作
    processViews();
    // 呼叫自己額外宣告的方法,執行所有註冊的工作
    processControllers();
}

provessViews()會透過View中的Id以取得UI物件,並指派給預先定義的變數,以便後續的處理

private ListView item_list;
private TextView show_app_name;

private void processViews() {
    item_list = (ListView)findViewById(R.id.item_list);
    show_app_name = (TextView) findViewById(R.id.show_app_name);
}