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

Slides:



Advertisements
Similar presentations
面向侧面的程序设计 方林博士 本文下载地址:
Advertisements

Android ADT + Android SDK Eclipse Eclipse 編輯器 JAVA JAVA 開發工具.
第2章  Android应用的界面编程.
第六 章数据库访问页 6.1 数据访问页视图 6.2 创建数据访问页 6.3 编辑数据访问页 6.4 查看数据访问页 退出.
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
Oracle数据库 Oracle 子程序.
在PHP和MYSQL中实现完美的中文显示
ArrayAdapter & Spinner
J2EE与中间件技术 ——Lab.
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
實驗四:單位轉換程式.
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
Ch06 再談選單元件 物件導向系統實務.
Hadoop I/O By ShiChaojie.
Android資料庫處理 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
Android智慧型手機程式設計實務應用班
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Chapter 6 進階UI設計.
ContentProvider與資料共享
ANDROID PROGRAMMING2.
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
6.4 Notification 通知栏.
實驗十四:顯示與控制地圖.
辅导课程六.
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
2019/1/12 GDP设计协同 超级管理员操作手册 GDP项目组.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
UI高级控件.
Chapter 5 Basic UI Design.
主编:钟元生 赵圣鲁.
實驗九:延續實驗八, 製作一個完整音樂播放器
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
VB与Access数据库的连接.
Web安全基础教程
数据库系统与应用实验 基于SQL Server 2005.
iSIGHT 基本培训 使用 Excel的栅栏问题
3.16 枚举算法及其程序实现 ——数组的作用.
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
Lync 2013 for Android 课程摘要卡 加入 Lync 会议 登录并开始使用 在会议中启动您的视频 更改状态或注销
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
進階UI元件:ListView元件以及複選 靜宜大學資管系 楊子青
RecyclerView and CardView
Python 环境搭建 基于Anaconda和VSCode.
Android Speech To Text(STT)
基于列存储的RDF数据管理 朱敏
VB与Access数据库的连接.
WEB程序设计技术 数据库操作.
使用ADO访问数据库 李宝智 BonizLee 课程 10564A
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
多个Activity的使用 本讲大纲: 1、使用Bundle在Activity之间交换数据 2、调用另一个Activity并返回结果
Presentation transcript:

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

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

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

项目三:开发手机通讯录 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 Dialog 有 5 种不同类型的对话框 课程导论

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

项目三:开发手机通讯录 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 ArrayAdapter 类示例 布局文件【 listviewdemo.xml 】,定义一个 ListView 控件。 <RelativeLayout xmlns:android=" <ListView 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 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 将系统通信录的联系人信息显示在列表中 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 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 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 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 定义 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 课程导论 任务实施

项目三:开发手机通讯录 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 任务实施(续) 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 课程导论