本文的目的是创建一个简单的ToDoList列表。
这个应用的功能是记录我的代办事项,简单到不需要本地存储,所有的代办事项都只是存储在内存中,就是只有程序打开的时候可以增加查看代办事项,当程序关闭的时候,代办事项就清空了。
代码在:https://github.com/jianfengye/Android_Works/tree/master/ToDoList
1 流程
流程和Windows Form的开发一样:
首先是界面设计,res/layout/main.xml 的设计。这里如果使用Android Common Xml Editor的话,可以使用可视化的控件设计。当然也可以直接使用xml的文本编辑器。
其次是程序中使用到的常量。res/values/中存放的就是配置参数的键值了。
再下来就是程序逻辑了。编写src/中的java逻辑代码。
2 layout
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进行处理。这个也是现在很多应用使用的方法了。
3 ArrayAdapter
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; } });