一、目标
1、将“二十六”介绍的读取联系人的方法移植到项目中;
2、选取读取到的联系人条目,将其号码自动填入文本框中(通过Intent方式在Activity之间传递数据)。
二、代码实现。
1、将读取联系人方法移植到项目中。
①.在主程序包(mobilesafe)下新建选择联系人类(SelectContactActivity),并在布局文件夹中(layout)新建”选择联系人“的布局文件(activity_select_contact.xml)。布局文件各联系人信息采用ListView组件显示。再在选择联系人类中的onCreate方法内通过setContentVie将布局文件和类关联。
布局文件代码:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <TextView
8 android:layout_width="match_parent"
9 android:layout_height="50dip"
10 android:background="#00ffff"
11 android:gravity="center"
12 android:text="请选择联系人"
13 android:textColor="#000000"
14 android:textSize="20sp" />
15
16 <ListView
17 android:id="@+id/list_select_contact"
18 android:layout_width="match_parent"
19 android:layout_height="match_parent" >
20 </ListView>
21
22 </LinearLayout>
View Code
②.在新建选择联系人类(SelectContactActivity)的主方法中复制适配器代码和“获取联系人”方法代码,同时将“读取联系人”类的单条联系人布局文件(contact_item_view)复制至项目布局文件下,更改适配器(contactListView.setAdapter())代码中相关参数的值。
新建选择联系人类(SelectContactActivity)代码:
1 public class SelectContactActivity extends Activity {
2 private ListView contactListView;
3
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.activity_select_contact);
8 contactListView = (ListView) findViewById(R.id.list_select_contact);
9 List<Map<String, String>> listContact = getContactInfo();
10 contactListView.setAdapter(new SimpleAdapter(this, listContact, R.layout.contact_item_view,
11 new String[]{"name","phone"}, new int[]{R.id.contact_item_name,R.id.contact_item_phone}));
12 }
13
14 /**
15 * 读取手机内的联系人信息
16 * @return
17 */
18 private List<Map<String, String>> getContactInfo() {
19 //获取内容解析器
20 ContentResolver resolver = getContentResolver();
21 List<Map<String, String>> listContacts = new ArrayList<Map<String,String>>();
22 //获取手机联系人数据库相关表的Uri
23 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
24 Uri uriData = Uri.parse("content://com.android.contacts/data");
25 //查询数据表中的相关数据
26 Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
27 null, null, null);
28 while (cursor.moveToNext()) {
29 String contact_id = cursor.getString(0);
30 if (contact_id != null) {
31 //具体的某一个联系人
32 Map<String,String> mapContact = new HashMap<String, String>();
33 Cursor dataCursor = resolver.query(uriData, new String[] {
34 "data1", "mimetype" }, "contact_id=?",
35 new String[] { contact_id }, null);
36 while(dataCursor.moveToNext()){
37 String data1 = dataCursor.getString(0);
38 String mimetype = dataCursor.getString(1);
39 if("vnd.android.cursor.item/name".equals(mimetype)){
40 //联系人姓名
41 mapContact.put("name", data1);
42 }else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
43 //联系人的电话号码
44 mapContact.put("phone", data1);
45 }
46 }
47 //将每个联系人放入List对象中
48 listContacts.add(mapContact);
49 //关闭Cursor对象
50 dataCursor.close();
51 }
52 }
53 //关闭Cursor对象
54 cursor.close();
55 return listContacts;
56 }
57 }
View Code
③.为项目新增“读取联系人”权限(<uses-permission android:name="android.permission.READ_CONTACTS"/>)。
2、选取读取到的联系人条目,将其号码自动填入文本框中
①.在选择联系人类(SelectContactActivity)中为获取的联系人列表(contactListView)设置条目点击事件(setOnItemClickListener(OnItemClickListener listener)),参数OnItemClickListener listener通过new OnItemClickListener(){}创建,并实现其未实现的方法(onItemClick(AdapterView<?> parent, View view,int position, long id));
②.在未实现的方法(onItemClick())中,通过主方法中获取的联系人信息列表(listContact)的get(int location)方法可以获知所点击条目的位置(由于内部类需要访问外部类,所以要将联系人信息列表(listContact)设置为final类型),再通过get(Object key)(参数为键名,这里是“phone”)获取所点击的联系人的号码,号码为String类型的值。
代码如下:
1 String phone = listContact.get(position).get("phone");
View Code
③.通过Intent方式将值传递至需要的Activity。new 出一个Intent,通过其putExtra(String name, String value)方法将传递过程中使用的键名(name)和值(value)加至Intent中,然后使用setResult(int resultCode, Intent data)为该Intent设置返回结果码(int resultCode)和数据(Intent data),注意setResult()方法后面必须有finish()方法(关闭当前Activity)。
Intent传递代码如下:
1 Intent intent = new Intent();
2 intent.putExtra("phone", phone);
3 setResult(0, intent);
4 //关闭当前页面
5 finish();
View Code
整个setOnItemClickListener方法代码如下:
1 contactListView.setOnItemClickListener(new OnItemClickListener() {
2
3 @Override
4 public void onItemClick(AdapterView<?> parent, View view,
5 int position, long id) {
6 //通过点击条目的位置和键名获取对应的值
7 String phone = listContact.get(position).get("phone");
8 //通过Intent的形式将获取到的值传递至下一个Activity
9 Intent intent = new Intent();
10 intent.putExtra("phone", phone);
11 setResult(0, intent);
12 //关闭当前页面
13 finish();
14 }
15 });
View Code
④.在设置向导第三步代码的选择联系人点击方法(selectContact(View view))中,通过带有结果集的启动另一个Activity方法(startActivityForResult(Intent intent, int requestCode))后,需要在onCreate方法总重写onActivityResult(int requestCode, int resultCode, Intent data)方法。
⑤.在重写的onActivityResult方法中首先判断Intent返回值(data)是否为空,如果为空则直接返回,如果不为空则通过Intent的getStringExtra(String name)根据键名获取对应的值,并通过replace(CharSequence target, CharSequence replacement)方法将电话号码中的“-”替换成“”,已符合中国人的习惯。
⑥.通过EditText对象的setText(CharSequence text)方法将⑤中获取的值放入“设置安全号码”的文本框中(如果该文本框未实例化,则需要实例化,即在layout布局文件中为其设置id,再在主代码中通过findViewById找到该文本框对象,最后通过setText方法设置值)
3、在设置向导第三步中,当点击下一步时要安全号码保存至配置文件中
①.通过SharedPreferences对象的getString(String key, String defValue)获取配置文件中是否已经保存了安全号码,参数key为配置文件中的键名,defValue表示得不到键名对应的值时的默认返回值。如果保存了则将其填入安全号码文本框中。
代码如下:
1 et_security_number.setText(sp.getString("security_number", ""));
View Code
②.在“设置向导第三步”类中的划向下一步方法(slideNext() )中,首先通过getText()方法获取编辑文本框内容,判断安全号码的文本框是否为空,若空则提醒并返回,若不为空则通过SharedPreferences对象保存至配置文件
代码如下:
1 //获取安全号码编辑框的内容
2 String security_number = et_security_number.getText().toString().trim();
3 //如果为空,则提醒后再返回
4 if(TextUtils.isEmpty(security_number)){
5 Toast.makeText(this, "未设置安全号码", 0).show();
6 return;
7 }
8 //如果不为空,则通过SharedPreferences对象保存至配置文件
9 Editor editor = sp.edit();
10 editor.putString("security_number", security_number);
11 editor.commit();
View Code