标签:
一、目标
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>
②.在新建选择联系人类(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 }
③.为项目新增“读取联系人”权限(<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");
③.通过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();
整个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 });
④.在设置向导第三步代码的选择联系人点击方法(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", ""));
②.在“设置向导第三步”类中的划向下一步方法(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();
标签:
原文地址:http://www.cnblogs.com/Red-Shark/p/4346557.html