摘要:[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其實也是把View與Controller分離出來。所以在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);
}