一、该应用包含以下功能
添加联系人
删除联系人
编辑联系人
联系人详情
打电话
发短信
二、界面如下
1 列表界面
2 添加编辑界面
3 长按列表item弹出的上下文菜单
4 发短信界面
5 详情界面
三、涉及的技术
1 常用控件 下拉框 单选框 复选框 图片按钮 菜单(点击menu弹出菜单 上下文菜单(长按菜单)等
1 菜单控件(点击menu弹出菜单) 在activity(点击menu弹出菜单中重写
1.1 在activity中重写 onCreateOptionsMenu方法 加入菜单项menu.add(1, 1, 1, "添加");
1.2 设置 actionbat显示 menu.add("添加")
.setShowAsAction (MenuItem.SHOW_AS_ACTION_IF_ROOM);//在actionbar上显示菜单项
1.3 在activity中重写 onOptionsItemSelected方法 之后根据菜单项的id或者tilte判断是按下了哪个菜单
2 上下文菜单(长按菜单)
2.1 给list控件登记 registerForContextMenu(listView);
2.2 activity中 重写onCreateContextMenu
2.3 activity中 重写 onContextItemSelected 增加菜单项选择事件
3 适配器adapter的使用
3.1 ArrayAdapter 单列的时候 适合简单数据类型 要求控件必须是textview类型
adpter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,list);
3.2 SimpleAdapter 多列时使用
android的系统布局最多只有两列,当然可以自定义布局文件,list数据元素是一个个的map
把map中的元素根据字符串数组 寻找到key,并把key对应的值绑定到相应顺序的控件上
3.3 CursorAdapter 游标适配器 查询数据库时返回使用
注意 在用CursorAdapter时 返回的主键字段必须为_id
3.4 自定义适配器 继承BaseAdapter
在列表显示中,listView 其实不能单独装载数据,它的每一列都需要各自独立的控件,
之后我们 用 适配器把数据绑定到各自独立的控件中。
数据如何绑定呢,
1 编写适配器类 继承BaseAdapter
2 因为数据要绑定的控件是在布局文件里的,所以要获得布局文件的实例
依靠LayoutInflater 类
(LayoutInflater)context.getSystemServ(Context.LAYOUT_INFLATER_SERVICE);
3 使用LayoutInflater的inflate方法或许布局文件实例 作用类似于findViewById()。
4 获得布局文件实例后 其实是view组件 在获取布局文件中的各个控件实例
根据position参 数对某行数据进行逐个绑定
5 利用缓存提高效率 tag
需要说明的一点是对于以上1,2,3步骤,
我们是可以通过硬编码的方式创建布局以及布局中的控件 的,其实布局也是view的一种
3.5 adapter绑定的数据更新后,如果数据不及时更新,
请调用 adapter.notifyDataSetChanged(); 数据更 新后及时告知主线程---ui线程
3.6 关于LayoutInflater这个类 它的作用类似于findViewById()。
不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;
而findViewById()是找xml 布局文件下的具体widget控件(如Button、TextView等)。
具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
2、对于一个已经载入的界面,就可以使用Activity.findViewById()方法来获得其中的界面元素。
4 activity如何通信的
1 如何启动activity
1.1 startActivity
1.2 startActivityForResult 可以接收返回结果
在打开的新的activity中调用setResult方法设置intent返回数据,关闭新的actibity
在前一个activity重写 onActivityResult 接收返回数据
利用请求码在onActivityResult方法中告诉是老的activity中哪个按钮打开 区分不同的点击事件
利用结果码来区分不同的新的activity返回 如一个activity可能打开多个新的activity,当关闭后
怎么区分是哪个activity呢,此时就用结果码判断
2 传递数据 利用intent以及bundle类 bundle类似map
2.1 利用Bundle类
2.2 直接使用intent 这种写法的作用等价于上面的写法,
只不过这种写法是把数据一个个地添加进Intent,这种写法使用起来比较方便,
2.3 如何传递复杂的数据类型,如对象或者集合,如果需要传递对象,
则对象需要序列化,在android中,序列化对象有两种方式
1 对象实现Serializable接口 jdk已经实现序列化了 之后调用intent的putExtra方法
2 对象实现Parcelable接口,自己实现序列化方法,
1 实现接口方法中writeToParcel写入需要序列化对象属性,如
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
。。。
}
2 定义一个public static final Parcelable.Creator<Person> CREATOR 变量,名字必须为CREATOR ,例如
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
public Person createFromParcel(Parcel source) {
//注意按照顺序读出 writeToParcel方法中怎么写入,source则怎么读出
return new Person(source.readString(), source.readInt(),
source.readString(), source.readString());
}
public Person[] newArray(int size) {
return new Person[size];
}
};
3 删除时跳出确认对话框 AlertDialog.Builder.create().show()
说明:本应用数据保存在内存中,下一次保存在文件与数据库中