Presentation is loading. Please wait.

Presentation is loading. Please wait.

项目三:开发手机通讯录 1 课程导论 任务三 实现查找与删除号码记录功能. 项目三:开发手机通讯录 2 任务分析 当有很多条联系人数据存储到记录存储中后,为方便用 户快速找到所需信息,需要提供一项查找功能。查询联 系人界面应提供一个文本框,由用户输入联系人的部分 信息后,点击【查询】按钮,界面显示出符合条件的联.

Similar presentations


Presentation on theme: "项目三:开发手机通讯录 1 课程导论 任务三 实现查找与删除号码记录功能. 项目三:开发手机通讯录 2 任务分析 当有很多条联系人数据存储到记录存储中后,为方便用 户快速找到所需信息,需要提供一项查找功能。查询联 系人界面应提供一个文本框,由用户输入联系人的部分 信息后,点击【查询】按钮,界面显示出符合条件的联."— Presentation transcript:

1 项目三:开发手机通讯录 1 课程导论 任务三 实现查找与删除号码记录功能

2 项目三:开发手机通讯录 2 任务分析 当有很多条联系人数据存储到记录存储中后,为方便用 户快速找到所需信息,需要提供一项查找功能。查询联 系人界面应提供一个文本框,由用户输入联系人的部分 信息后,点击【查询】按钮,界面显示出符合条件的联 系人。要完成本次任务,需要思考如下两个问题: 如何把查询条件传递给 SQLite 数据库,并进行模糊查询? 如何把查询结果的每条记录显示在界面上? 课程导论

3 项目三:开发手机通讯录 3 课程导论 相关知识

4 项目三:开发手机通讯录 4 Dialog 类 对话框一般是出现在当前 Activity 之上的小窗口。处于下层的 Activity 失去焦点,对话框接受所有的用户交互, 一般用于提示信息。对话框在程序中不是必备的,但是用好对话框能够增加应用的友好性。比较常见的情 景:用户登录、网络正在下载、下载成功或失败的提示、电池电量耗尽等,会用到对话框。 Dialog 类有两种构造方法,格式分别如下 ( 1 ) Dialog ( Context context ):使用默认的框架样式创建一个对话框,参数 context 表示上下文。 ( 2 ) Dialog ( Context context , int theme ):使用定制的样式创建一个对话框,参数 theme 表示描 述窗口主题的样式资源。可以在项目的 “res/values” 目录下定义 XML 样式文件。 Dialog 作为一个可以显示的对话框,很多实现方法和 Activity 相同,在此不再一一赘述,下面主要对其常用 的方法进行介绍。 void cancel() :退出对话框。 void dismiss () :退出对话框,功能和 cancel() 相同。 void hide() :隐藏但不退出对话框。 void onCreate ( Bundle savedInstanceState ):在对话框创建时被系统调用,利用该方法初始化对 话框的设置,包括调用 setContentView ( View )。 void setContentView ( View view ):设置对话框的视图,参数 view 表示需要显示的内容。 void setContentView ( int layoutResID ):设置对话框的视图,参数 layoutResID 表示资源布局文件 的 ID 。 void setTitle ( int titleId ):设置对话框的标题,参数 titleId 表示标题文本的资源标识符。 void setTitle ( CharSequence title ):设置对话框的标题,参数 title 表示标题文本的内容。 void show () :启动对话框并显示在屏幕上。 课程导论

5 项目三:开发手机通讯录 5 Dialog 有 5 种不同类型的对话框 课程导论

6 项目三:开发手机通讯录 6 进度对话框代码示例 public class ProgressDialogDemo extends Activity { ProgressDialog dialog; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); dialog=ProgressDialog.show(ProgressDialogDemo.this," 加载 "," 加载中, 请稍候..",true); // 使用一个线程, 在 4 秒后移除进度对话框 new Thread(){ public void run(){ try{ sleep(4000); }catch(Exception e){ e.printStackTrace(); }finally{ dialog.dismiss(); } }.start(); } 课程导论

7 项目三:开发手机通讯录 7 ListView 类 ListView 是比较常用的控件,以垂直列表的形式展示具体内容。内容可以是文字和图片,并且能够根据数 据的长度自适应显示。本任务在显示联系人名单时就用到了 ListView 。 除此之外,常用的 View 控件有: TextView 、 ImageView 、 ProgressBar 、 AutoCompleteTextView 、 Button 、 CheckBox 、 EditText 、 ImageButton 、 ImageSwitcher 、 RadioButton 、 RadioGroup , SeekBar 、 Spinner 、 TabHost 、 TabWidget 、 TableLayout 、 WebView 等。. 这些控件有一个类似的构造方法:类名( Context context )。例如 ListView 可以使用构造方法 ListView ( Context context ),若在 Java 代码中生成一个 View 实例,就可以用这个万金油式的构造方法。 创建 ListView 有三种方法:第一种是在 XML 文件中使用 ListView 控件;第二种是直接继承 ListActivity ;第三 种是在 JAVA 文件中直接新建 ListView 对象。建议在 XML 文件中使用 ListView 控件,这样可以较好地控制其 属性。如在 Activity 中构造一个 ListView : ListView listView=new ListView(this); ListView 几个比较重要的方法介绍如下: setAdapter ( ListAdapter adapter )方法:向 ListView 对象添加适配器。参数 adapter 表示适配器。这 样当数据发生变化之后, ListView 会自动更新并显示。 void setOnItemClickListener ( AdapterView.OnItemClickListener listener )):对适配器中的数据项 添加监听器,当数据项被点击时,将触发相应的操作。参数 listener 表示监听器。一般的编写方法如 下,其中 listView 为 ListView 对象, onItemClick 方法的 position 参数用于表示用户在列表中点击数据的 位置,数值从 0 开始。 listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id){ // 在函数中编写数据项被点击后的处理代码 … } }); 课程导论

8 项目三:开发手机通讯录 8 Adapter 类 Adapter 的应用非常广泛,可看作是数据源和 ListView 、 Spinner 、 Gallery 、 GridView 等 UI 显示控件之间的桥梁,当数据源发生变化时, Adapter 可以使 UI 控件的数据自动更新显示。 图 3-11 展示了 Adapter 在数据和 UI 控件之间的作用。比较常用的基础数据适 配器有 BaseAdapter 、 ArrayAdapter 、 SimpleAdapter 、 SimpleCursorAdapter 、 CursorAdapter 等。其中 ArrayAdapter 、 CursorAdapter 、 SimpleAdapter 等还直接提供了 getFilter() 方法对数据进行过 滤的功能,例如用户在文本框中输入部分字符,视图可以过滤显示匹配的内 容。 课程导论

9 项目三:开发手机通讯录 9 ArrayAdapter 类 数组适配器,使用起来较为简单,但只能用于显示文字。 ArrayAdapter 常用的构造函数是 ArrayAdapter ( Context context , int textViewResourceId , T[] objects ),可创建一个用于装配数据的数 组装配器。参数 context 表示上下文,一般用当前的 Actvity 表示;参数 textViewResourceId 表示布局文件,该布局文件的作用是描述数组中 每一条数据的显示布局(如定义一个 TextView ),既可以使用 Android 内部提供的布局文件(如 android.R.layout.simple_list_item_1 , android.R.layout.simple_ expandable_list_item_1 ,可以在 Android SDK 安装目录下搜索出这些文件,并打开查看它们的详细定义),也 可以使用程序员自己定义的布局文件; objects 表示要显示的数据数组。 listView 会根据这三个参数,遍历数组中的每一条数据,每读出一条, 则将其显示到第二个参数对应的布局中,这样就形成了我们看到的 ListView 显示效果。 课程导论

10 项目三:开发手机通讯录 10 ArrayAdapter 类示例 布局文件【 listviewdemo.xml 】,定义一个 ListView 控件。 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > ListViewDemo 程序代码如下: public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); // 定义一个布局文件名为【 listviewdemo 】, 在布局文件中添加一个列表,id 为 list_view setContentView(R.layout.listviewdemo); ListView listView =(ListView)findViewById(R.id.list_view); // 列表项数组 String[] weeks={" 星期天 "," 星期一 "," 星期二 "," 星期三 "," 星期四 "," 星期五 "," 星期六 "}; // 建立数组适配器 ArrayAdapter adapter= new ArrayAdapter(this,android.R.layout.simple_list_item_1,weeks); // 为 ListView 设置适配器 listView.setAdapter(adapter); } 课程导论

11 项目三:开发手机通讯录 11 SimpleCursorAdapter 类 游标适配器,从数据库中读取数据并显示在列表上。其原理是:从 Cursor 游标取出数据并用 ListView 进行显示,然后把指定的数据字段 列映射到 TextView 或者 ImageView 中。 SimpleCursorAdapter 类的构造函数: SimpleCursorAdapter ( Context context , int layout , Cursor c , String[] from , int[] to ): 创建一个游标适配器。参数 context 表示上下文,一般用当前的 Actvity 表示;参数 layout 表示布局文件,作用与 ArrayAdapter 构造函数中的 textViewResourceId 一样;参数 c 表示数据库游标,如果游标不可用, 则取值为 null ; from 表示绑定到显示在 UI 上的数据字段列表; to 表示 对应显示参数 from 列的视图。 注意:从构造函数来看,以数据库作为数据源时才适合使用 SimpleCursorAdapter 。而且需要显示数据库的表要具有一个主键字 段 _id ,否则会报错。 课程导论

12 项目三:开发手机通讯录 12 将系统通信录的联系人信息显示在列表中 public class SimpleCursorAdapterDemo extends Activity { public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.listviewdemo); ListView mListView =(ListView)findViewById(R.id.list_view); //getContentResolver() 返回一个 ContentResolver 对象, 用于访问某个 ContentProvider // 用 query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder) 方法获得一个指定 URI 的 Cursor 对象 // 参数 projection 表示返回的列, 参数 selection 表示 SQL 的 where 查询条件 // 参数 selectionArgs 表示 where 语句中表达式的 ? 占位参数列表, 参数 sortOrder 表示要进行升序或降序的字段 Cursor mCursor=getContentResolver().query(People.CONTENT_URI,null,null,null,null); // 将 Cursor 对象交由 Activity 管理, 这样 Cursor 的生命周期和 Activity 便能够自动同步, 省去手动管理 Cursor 的烦恼 startManagingCursor(mCursor); // android.R.id.text1 在 android.R.layout.simple_expandable_list_item_1 文件中做了定义 SimpleCursorAdapter mAdapter= new SimpleCursorAdapter(this,android.R.layout.simple_expandable_list_item_1, mCursor,new String[]{People.NAME},new int[]{android.R.id.text1}); mListView.setAdapter(mAdapter); } 注意:系统通信录应有数据,并在【 AndroidMainfest.xml 】文件中把读取通讯录的权限打开: 课程导论

13 项目三:开发手机通讯录 13 SimpleAdapter 类 具有较强的扩展性,能自定义出各种效果。不仅可以添加 ImageView (图片),还可以添加 Button (按钮), CheckBox (复选框)等。 SimpleAdapter 类的构造函数是: SimpleAdapter ( Context context , List > data , int resource , String[] from , int[] to )。参数 context 表示上下文,一般用当前的 Actvity 表示;参数 data 表示由 Map 构成的 List , List 集合中的每个数据由一个 Map 集合组 成,每一个 Map 集合即对应 ListView 的每一行,要求 Map 集中的第一 个关键字必须是 String 类型;参数 resource 表示布局文件,作用与 ArrayAdapter 构造函数中的 textViewResourceId 一样; from 表示绑定 到 UI 上的数据字段列表; to 表示对应显示参数 from 列的视图。 课程导论

14 项目三:开发手机通讯录 14 SimpleAdapter 示例 示例通过直接继承 ListActivity 类,利用 SimpleAdapter 来创建一个能够显示图片和文字的程序界面,如图 3-13 所示。 ListActivity 类其实就是含有一个 ListView 控件的 Activity 类,在程序代码中使用更方便。如前面两个例子,直接在普 通的 Activity 中加入一个 ListView 也完全可以取代 ListActivity 。 public class SimpleAdapterDemo extends ListActivity { public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); SimpleAdapter adapter=new SimpleAdapter(this,getData(),R.layout.simpleadapter_demo, new String[]{"imge","title","info"}, new int[]{R.id.imageView,R.id.titleView,R.id.infoView}); setListAdapter(adapter); } private List > getData() { List > list=new ArrayList >(); Map map=new HashMap (); map.put("title","G1"); map.put("info","google 1"); map.put("imge",R.drawable.icon); list.add(map); map=new HashMap (); map.put("title","G2"); map.put("info","google 2"); map.put("imge",R.drawable.icon); list.add(map); map=new HashMap (); map.put("title","G3"); map.put("info","google 3"); map.put("imge",R.drawable.icon); list.add(map); return list; } 课程导论

15 项目三:开发手机通讯录 15 BaseAdapter 类 通过继承 BaseAdapter 子类,可以更灵活地显示和处理数据,例如:在视图上添加点击按钮处理事 件;又例如:手机短信界面中自己发送的消息在右侧,对方发送的信息在左侧,并可以使用不同的 颜色来进行区别。 定义一个 BaseAdapter 的子类,实现起来较为复杂,需要实现如下方法: ① int getCount() :返回适配器所表示的数据项的数量。 ② Object getItem ( int position ):返回数据集中指定位置的数据项。参数 position 表示位置。 ③ long getItemId ( int position ):返回列表中指定位置的行 ID 。参数 position 表示位置。 ④ View getView ( int position , View convertView , ViewGroup parent ):返回一个显示数据集中指定 位置数据的视图。参数 position 表示某个位置的数据;参数 convertView 用于显示每一数据项的视图 ;参数 parent 表示父视图,例如 Spinner 、 ListView 、 GridView 等,即显示最终会被附加到的父视图 。需要注意的是:当调用这个方法时,参数 convertView 是循环再用的。因此在编写该方法的实现 代码时需要判断 convertView 对象是否为空。若为空,则需要为它实例化一个视图对象并配置相关 的显示属性。 ListView 在开始绘制的时候,系统会首先调用 getCount() 函数,根据其返回值得到 ListView 的长度, 然后根据这个长度,调用 getView() 逐一绘制每一行。如果 getCount() 返回值为 0 时,列表将不显示 数值。 当视图关联的数据集有变动时(在本项目中,将表示通信录用户信息的数组 users 作为显示的数据 源,见 3.9 项目的完整代码),可调用 BaseAdapter 类的 notifyDataSetChanged() 方法,来通知 ListView 视图刷新显示自己所负责的数据,这样就避免了人工重新检索和更新数据的显示。 课程导论

16 项目三:开发手机通讯录 16 定义 BaseAdapter 适配器示例 private class MyAdapter extends BaseAdapter{ public int getCount() { // 假设 data 为一组需要显示的数据, 用数组表示 return data.length; } public Object getItem(int position){ // 返回 position 位置处的数据 return data[position]; } public long getItemId(int position){ return position; } public View getView(int position,View convertView,ViewGroup parent){ // getApplicationContext() 用于获取应用程序上下文 TextView mTextView=new TextView(getApplicationContext()); mTextView.setText("A BaseAdapter Demo"); mTextView.setTextColor(Color.YELLOW); return mTextView; } 课程导论

17 项目三:开发手机通讯录 17 课程导论 任务实施

18 项目三:开发手机通讯录 18 任务实施 定义一个 XML 布局页面【 find.xml 】作为查找界面,为用户提供输入搜索信息的文本框,并设置【查询】和【取消】 按钮, P123 在 ContactsTable.java 类中添加查询 findUserByKey ( String key )方法。该方法使用 % 来模糊匹配联系人的用户名、 手机号 QQ 号等信息,使用一个游标 Cursor 对象表示查找结果,然后通过循环调用取出游标中的数值。 public User[] findUserByKey(String key) { Vector v=new Vector (); // 定义一个专门存放 User 类型数据的 Vector 向量类对象 Cursor cursor=null; try { cursor=db.find("select * from "+TABLENAME +" where “ +User.NAME+" like '%"+key+"%' " + " or "+User.MOBLIE+" like '%"+key+"%' " + " or "+User.QQ+" like '%"+key+"%' ",null); while(cursor.moveToNext()){ User temp=new User(); temp.setId_DB(cursor.getInt( cursor.getColumnIndex("id_DB"))); …// 省略 v.add(temp); // 将符合查询条件的 User 对象添加到向量集合中 } } catch(Exception e){ e.printStackTrace(); } 课程导论

19 项目三:开发手机通讯录 19 任务实施(续) finally { if(cursor != null){ cursor.close(); } db.closeConnection(); } if(v.size() > 0){ // 将 vector 中的数据,强制以 User 数组形式返回 return v.toArray(new User[] {}); }else { User[] users=new User[1]; User user=new User(); user.setName(" 无结果 "); users[0]=user; return users; } 定义用户查找对话框类,继承于 Dialog 类,显示用户布局页面【 find.xml 】,并处理查找和退出相关的按钮事件, P125 课程导论


Download ppt "项目三:开发手机通讯录 1 课程导论 任务三 实现查找与删除号码记录功能. 项目三:开发手机通讯录 2 任务分析 当有很多条联系人数据存储到记录存储中后,为方便用 户快速找到所需信息,需要提供一项查找功能。查询联 系人界面应提供一个文本框,由用户输入联系人的部分 信息后,点击【查询】按钮,界面显示出符合条件的联."

Similar presentations


Ads by Google