本文的目的是創建一個簡單的ToDoList列表。
這個應用的功能是記錄我的代辦事項,簡單到不需要本地存儲,所有的代辦事項都只是存儲在內存中,就是只有程序打開的時候可以增加查看代辦事項,當程序關閉的時候,代辦事項就清空了。
代碼在:https://github.com/jianfengye/Android_Works/tree/master/ToDoList
流程和Windows Form的開發一樣:
首先是界面設計,res/layout/main.xml 的設計。這裡如果使用Android Common Xml Editor的話,可以使用可視化的控件設計。當然也可以直接使用xml的文本編輯器。
其次是程序中使用到的常量。res/values/中存放的就是配置參數的鍵值了。
再下來就是程序邏輯了。編寫src/中的java邏輯代碼。
layout定義了一個可視化的用戶界面,我們可以使用兩種方法來定義layout:
在XML中定義UI元素
在運行時延遲加載UI元素
使用XML定義UI元素的好處就是將邏輯層和現實層分離開。通常情況下,XML中的控件元素名稱和控件類名稱是對應的,而且屬性的名稱和類的方法也是對應的,比如EditText控件有個text屬性,那麼在EditText控件類中就有個setText()方法。
每個控件都可以有一個id屬性,在res/main.xml中,對一個控件設置id屬性應該使用@符號開頭,比如<Button android:id="@+id/my_button">,其中的@符號表示這個字符串應該被當作id字符串和id資源被解析。其中的+號表示這個是個新資源文件,必須被加到R.java文件中去。擁有ID屬性的控件可以在程序中使用findViewById定位出來。
每個控件都需要設置的是layout_width和layout_height,表示這個控件的大小。
這兩個屬性的值可以是wrap_content和fill_parent(在 API LEVEL 8之後也叫match_parent
)。wrap_content意思是僅僅包含住內容的大小就行了。fill_parent的意思是擴展到父節點的大小。
注意,在長度設置的時候,不要使用像素大小來進行設置(盡管那個是可行的)。建議使用dp(像素無關大小),wrap_content或者fill_parent進行設置。
layout的類型分為三種:linear layout, relative layout 和 webview。
linear layout意思是線性的,分層的排列,和html中默認的標簽排序是一樣的。
relative layout意思是相對的,和html中relative的意思是一樣的。
webview就是可以內嵌html進行處理。這個也是現在很多應用使用的方法了。
layout除了可以通過xml在onCreate的時候繪制,也可以在運行中不斷增加,即內容是動態的。我們可以使用AdapterView來進行增加。具體就是將一個ArrayAdapter綁定到一個AdapterView上。比如ListView。
大概的代碼如下:
ListView myListView = (ListView)findViewById(R.id.myListView );
final EditText myEditText = (EditText)findViewById(R.id.myEditText );
//獲得對UI小組件的引用
final ArrayList<String> todoItems = new ArrayList<String>();
final ArrayAdapter<String> aa;
aa = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1 , todoItems);
myListView.setAdapter(aa);
然後當你修改了ArrayAdapter中的值的時候,你需要通知其綁定的控件做更新,就要使用notifyDataSetChanged()這個函數了。
比如:
myEditText .setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN )
if((keyCode == KeyEvent.KEYCODE_DPAD_CENTER ) ||
(keyCode == KeyEvent.KEYCODE_ENTER )) {
todoItems.add(0, myEditText.getText().toString());
aa. notifyDataSetChanged();
myEditText.setText( "");
return true;
}
return false;
}
});