Android学习之一:通讯录
来源:互联网 发布:口风琴基础教程软件 编辑:程序博客网 时间:2024/06/11 18:41
自己练手的一个小程序。
有如下功能:
1.读取系统联系人信息,将联系人姓名、号码、邮箱和头像读取出来,显示到界面上。
2.对系统联系人信息进行增删改查。
3.可以调用系统的拨号功能,进行拨打电话的操作。
4.通过一个免费的查询号码归属地的api接口,可以对某个号码的归属地进行查询。
非常简单的一个小程序。但是因为新手,各种不熟悉,所以过程还是有点艰辛,遇到了好多bug。
得到的:
在这个过程中,对于ContentProvider有了更深的了解。尤其是可以通过一个Uri获取到联系人的所有信息,这个学到了。
对HttpConnection和JSON格式的解析也有了更深的了解。
不足的:
联系人头像,本程序中可以通过拍照然后裁剪、从相册选取照片然后裁剪,设置到ImageView上。对这里尤其不熟,查了很多资料。但是仍旧不成功。在论坛上问人,终于知道魅族手机的照片裁剪跟别的手机不一样。好心塞。
遗憾:
系统联系人姓名展示在listview中,应该是进行首字母排序的。我在网上搜了搜,中文首字母排序有点麻烦。以后再增加这个功能吧。
吶,不管过程怎么样,最后做出来还是挺开心的。
贴代码吧:
首先是展示系统所有的联系人
public class Contacts extends Activity implements View.OnClickListener,AdapterView.OnItemClickListener{ /** * uri * */ public static final Uri ContactsUri = ContactsContract.Contacts.CONTENT_URI; public final String ID = ContactsContract.Contacts._ID; public final String NAME = ContactsContract.Contacts.DISPLAY_NAME; /** * serch标识 * */ public static boolean FROM_SERCH = false; /** * contentresover对象 * */ public ContentResolver contentResolver; /** * 控件初始化 * */ public ListView listView; public EditText input; public Button serch; /** * 数据源初始化 * */ public List<String> contactsList; /** * 适配器初始化 * */ public ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contacts); //控件初始化和监听事件 init(); //读取系统联系人,存储到contactsList 中 contactsList = new ArrayList<String>(); readContacts(); //视图加载适配器 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList); listView.setAdapter(adapter); } /** * 复写onresume方法,当本页面重新获取焦点时,刷新listview内容 * */ @Override protected void onResume() { super.onResume(); //从数据库中重新获取所有的联系人名字,然后listview更新 contactsList.clear();//先清除list集合中原有的联系人name,然后重新获取,否则会重复加载多个联系人的name readContacts(); adapter = null; adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList); listView.setAdapter(adapter); } /** * 控件初始化 * */ public void init(){ listView = (ListView) findViewById(R.id.listview); input = (EditText) findViewById(R.id.serch); serch = (Button) findViewById(R.id.bt_serch); //点击事件 serch.setOnClickListener(this); listView.setOnItemClickListener(this); } /** * 获取联系人名字 * */ public void readContacts(){ //获取contentResolver对象 contentResolver = getContentResolver(); //查询联系人id和名字 Cursor cursor = contentResolver.query(ContactsUri,null,null,null,null); while (cursor.moveToNext()){ String id = cursor.getString(cursor.getColumnIndex(ID)); Log.i("test",id); String name = cursor.getString(cursor.getColumnIndex(NAME)); Log.i("test", name); //联系人名字加入list集合中, contactsList.add(name); } if (cursor != null){ cursor.close(); } } @Override public void onClick(View v) { switch (v.getId()){ case R.id.bt_serch: String serchName = input.getText().toString(); Log.i("test",serchName); List<String> serchNameList = new ArrayList<String>(); //在contactsList中进行匹配,看是否有这个名字,如果有,每查到一个人,就存储到contactsList中。 for(int i = 0;i<contactsList.size();i++){ String name = contactsList.get(i); if(name.contains(serchName)){ serchNameList.add(name); } } //更新listview adapter = null; adapter = new ArrayAdapter<String>(Contacts.this,android.R.layout.simple_list_item_1,serchNameList); listView.setAdapter(adapter); input.setText(""); Log.i("test", "contactsList内容更新"); FROM_SERCH = true; break; } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String personName = contactsList.get(position); String personID = null; //根据name查找contacts中的id,将id发送过去 contentResolver = getContentResolver(); Cursor cursorId = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts.DISPLAY_NAME +"=?", new String[]{personName}, null); while (cursorId.moveToNext()){ personID = cursorId.getString(cursorId.getColumnIndex(ContactsContract.Contacts._ID)); } Log.i("test",personID);// 弹出联系人详情页面 Intent contactIntent = new Intent(Contacts.this,OneContact.class); contactIntent.putExtra("person_id",personID); startActivity(contactIntent); Log.i("test","下一个页面"); } /** * 复写back键 * */ @Override public void onBackPressed() { if (FROM_SERCH == true){ adapter = null; adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList); listView.setAdapter(adapter); FROM_SERCH = false; }else { finish(); } }}
然后是某个联系人的详细信息界面:
/** * Created by lee on 2016/10/8. * 联系人详情界面 */public class OneContact extends Activity implements View.OnClickListener{ /** * uri * */ public final Uri DataUri = ContactsContract.Data.CONTENT_URI; public final String DataID = ContactsContract.Data.CONTACT_ID; public final String DataMimeType = ContactsContract.Data.MIMETYPE; public final String DataData1 = ContactsContract.Data.DATA1; public final String DataIcon = ContactsContract.Data.DATA15; /** * 控件 * */ private ImageView icon,edit_icon; private TextView name,num,email,location; private EditText et_name,et_num,et_email; private Button bt_ok,edit,delete; private Button bt_serch_location; private LinearLayout edit_name,edit_num,edit_email,linera_button,linear_name,linear_num,linear_email; /** * ContentResolver * */ private ContentResolver contentResolver; /** * 联系人信息 * */ private String personID = null; private String personNum = null; private String personEmail = null; private String personName = null; private byte[] personIcon = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.one_contact_layout); /** * 控件初始化和监听事件 * */ init(); //存储拍照的照片和裁剪照片的file初始化 File file = new File(appDaultDir+File.separator+"tempImage.jpg"); imageuri = Uri.fromFile(file); File cropFile = new File(appDaultDir+File.separator+"temp_crop.jpg"); imageCropUri = Uri.fromFile(cropFile); //从intent中获取personid。 Intent intent = getIntent(); personID = intent.getStringExtra("person_id"); // 根据personid,获取num,email,icon; getNameNumEmailIcon(personID);// Log.i("test", "id" + personID + "_--" + "名字" + personName + "_--" + "电话" + personNum + "_--" + "邮箱" + personEmail + "照片" + personIcon); //将name,num,email显示在控件中 name.setText(personName); num.setText(personNum); email.setText(personEmail); //将personicon显示在控件中 if (personIcon == null){ //数据库没有照片,什么都不显示 return; }else{ //数据库中有联系人照片,则加载数据库中照片; Bitmap bitmap = BitmapFactory.decodeByteArray(personIcon,0,personIcon.length); icon.setImageBitmap(bitmap); } } /** * 根据id从内容提供者中获取name,num,email,icon的方法 * 从一个cursor中获取这些信息,这是我通过这个练手学到的 * */ public void getNameNumEmailIcon(String personID){ contentResolver = getContentResolver(); //根据personID,从一个cursor中获取name,num,email Cursor cursorInfo = contentResolver.query(DataUri, new String[]{DataID,DataMimeType,DataData1,DataIcon}, DataID+"=?", new String[]{personID}, null); while (cursorInfo.moveToNext()){ String mimetype = cursorInfo.getString(cursorInfo.getColumnIndex(DataMimeType)); String value = cursorInfo.getString(cursorInfo.getColumnIndex(DataData1)); //获取icon personIcon = cursorInfo.getBlob(cursorInfo.getColumnIndex(DataIcon)); //获取name if (mimetype.contains("/name")){ personName = value; }else if (mimetype.contains("/email")){ //获取email personEmail = value; }else if (mimetype.contains("/phone")){ //获取num personNum = value; }} } /** * 控件初始化,监听事件 * */ public void init(){ //imageview icon = (ImageView) findViewById(R.id.iv_icon); edit_icon = (ImageView) findViewById(R.id.edit_icon); //textview name = (TextView) findViewById(R.id.tv_name); num = (TextView) findViewById(R.id.tv_num); email = (TextView) findViewById(R.id.tv_email); //button edit = (Button) findViewById(R.id.bt_edit); delete = (Button) findViewById(R.id.bt_delete); bt_serch_location = (Button) findViewById(R.id.serch_location); //edittext et_name = (EditText) findViewById(R.id.et_name); et_num = (EditText) findViewById(R.id.et_num); et_email = (EditText) findViewById(R.id.et_email); //button bt_ok = (Button) findViewById(R.id.bt_ok); //linearlayout edit_name = (LinearLayout) findViewById(R.id.edit_name); edit_num = (LinearLayout) findViewById(R.id.edit_num); edit_email = (LinearLayout) findViewById(R.id.edit_email); linera_button = (LinearLayout) findViewById(R.id.linear_button); linear_name = (LinearLayout) findViewById(R.id.linera_name); linear_num = (LinearLayout) findViewById(R.id.linear_num); linear_email = (LinearLayout) findViewById(R.id.linear_email); //监听事件 edit.setOnClickListener(this); delete.setOnClickListener(this); bt_ok.setOnClickListener(this); edit_icon.setOnClickListener(this); num.setOnClickListener(this); bt_serch_location.setOnClickListener(this); } /** * 点击事件 * */ @Override public void onClick(View v) { switch (v.getId()){ //查询某个号码的归属地的按钮 case R.id.serch_location: Intent intent2 = new Intent(OneContact.this,LocationActivity.class); intent2.putExtra("number",personNum); startActivity(intent2); break; case R.id.tv_num: //隐式intent,调用系统拨号界面 Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:"+personNum)); startActivity(intent); break; case R.id.edit_icon: //初始化路径 appDaultDir = Environment.getExternalStorageDirectory().getAbsolutePath();// Log.i("test",appDaultDir); //显示选择对话框 showPhotoDialog(); break; case R.id.bt_edit: //隐藏textview linear_name.setVisibility(View.GONE); linear_num.setVisibility(View.GONE); linear_email.setVisibility(View.GONE); //隐藏头像view icon.setVisibility(View.GONE); //隐藏编辑和删除键 linera_button.setVisibility(View.GONE); //显示edittext,button edit_name.setVisibility(View.VISIBLE); edit_num.setVisibility(View.VISIBLE); edit_email.setVisibility(View.VISIBLE); bt_ok.setVisibility(View.VISIBLE); //显示头像view edit_icon.setVisibility(View.VISIBLE); //显示原来的名字号码邮件 et_name.setText(personName); et_num.setText(personNum); et_email.setText(personEmail); //显示头像 if (personIcon == null){ return; }else{ Bitmap bitmap = BitmapFactory.decodeByteArray(personIcon,0,personIcon.length); edit_icon.setImageBitmap(bitmap); }// Log.i("test","textiew控件隐藏,edittext,button控件显示"); break; case R.id.bt_ok: //根据用户输入的name和num和Email和icon,更新系统联系人信息 String newName = et_name.getText().toString(); String newNum = et_num.getText().toString(); String newEmail = et_email.getText().toString(); Bitmap newBitmap =((BitmapDrawable)edit_icon.getDrawable()).getBitmap(); //newBitmap转为byte[] ByteArrayOutputStream stream = new ByteArrayOutputStream(); newBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] newPersonIcon = stream.toByteArray();// Log.i("test","新的联系人信息"); //更新数据库中的联系人信息 if ((!TextUtils.isEmpty(newName))&&(!TextUtils.isEmpty(newNum))){ //只有名字和号码都不为空时,才会去更新系统联系人信息 updateOneContact(personID, newName, newNum, newEmail, newPersonIcon); //更新完成后,隐藏edittext和button edit_name.setVisibility(View.GONE); edit_num.setVisibility(View.GONE); edit_email.setVisibility(View.GONE); bt_ok.setVisibility(View.GONE); //显示textview linear_name.setVisibility(View.VISIBLE); linear_num.setVisibility(View.VISIBLE); linear_email.setVisibility(View.VISIBLE); //显示imageview icon.setVisibility(View.VISIBLE); //显示按钮 linera_button.setVisibility(View.VISIBLE); //重新从数据库中,根据id获取联系人信息 getNameNumEmailIcon(personID); //将新的信息显示在textview上 name.setText(personName); num.setText(personNum); email.setText(personEmail); //将新的头像显示在不可编辑的imageview上 Bitmap bitmap = BitmapFactory.decodeByteArray(newPersonIcon, 0, newPersonIcon.length); icon.setImageBitmap(bitmap); }else { Toast.makeText(OneContact.this,"名字和号码不能为空",Toast.LENGTH_SHORT).show(); } break; case R.id.bt_delete: //弹出对话框,确认是否删除 showMyDialog(); break; } } /** * requestCode * */ public static final int CROP_PHOTO = 1; public static final int TAKE_PHOTO = 2; private Uri imageuri; private Uri imageCropUri; private String appDaultDir = null; /** * 拍照 * */ public void takePhotoFromPhone(){// Log.i("test","调用takePhotoFromPhone方法"); //构建隐式intent,调用相机 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra("filePath", imageuri); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri); startActivityForResult(intent, TAKE_PHOTO); } /** * 调用系统相册,选择图片作为头像 * */ public void getPhotoFromPhone(){// Log.i("test", "调用getPhotoFromPhone方法"); //隐式intent,启动相册 Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); intent.putExtra("crop", true); intent.putExtra("scale", true); intent.putExtra("filePath",imageuri); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri); startActivityForResult(intent, CROP_PHOTO); } /** * onActivityResult方法 * */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { contentResolver = getContentResolver(); switch (requestCode){ case TAKE_PHOTO: if (resultCode == RESULT_OK){ //隐式intent,调用裁剪功能 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(imageuri, "image/*"); intent.putExtra("scale",true); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri); startActivityForResult(intent,CROP_PHOTO); } break; case CROP_PHOTO: if (resultCode == RESULT_OK){ Log.i("test","启动裁剪程序"); // 拿到剪切数据 String filePath = data.getStringExtra("filePath"); Bitmap bitmap = BitmapFactory.decodeFile(filePath); //将bitmap缩小// bitmap = setScaleBitmap(bitmap,5); //将选取的照片显示在imageview上 edit_icon.setImageBitmap(bitmap); Log.i("test","将选取的照片显示在imageview上"); } break; } } /** * 将图片缩小 * */ public Bitmap setScaleBitmap(Bitmap photo,int scale){ if (photo!=null){ Bitmap smallBitmap = zoomBitmap(photo,photo.getWidth()/scale,photo.getHeight()/scale); photo.recycle(); return smallBitmap; } return null; } /** * 实际缩小图片的方法 * */ private Bitmap zoomBitmap(Bitmap bitmap,int width,int height){ int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float matrixX = width/w; float matrixY = height/h; matrix.postScale(matrixX,matrixY); Bitmap newBitmap = bitmap.createBitmap(bitmap,0,0,w,h,matrix,true); return newBitmap; } /** * 显示头像选择对话框 * */ public void showPhotoDialog(){ final int[] MyWhich = {0}; //点击头像图片后,弹出对话框,选择拍照或者相册 AlertDialog.Builder dialog = new AlertDialog.Builder(OneContact.this); Log.i("test","创建头像选择对话框"); //下拉框的数据源 String[] choose = {"拍照","从相册选择"}; dialog.setSingleChoiceItems(choose, 0, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { MyWhich[0] = which; } }); //设置确定和取消按钮 dialog.setNegativeButton("取消",null); dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (MyWhich[0] == 0){ //拍照 takePhotoFromPhone(); }else if(MyWhich[0] == 1){ //相册 getPhotoFromPhone(); } } }); //显示对话框 dialog.show(); } /** * 更新数据库中联系人信息 * */ public void updateOneContact(String personID,String newName,String newNum,String newEmail, byte[] newIcon){ contentResolver = getContentResolver(); ContentValues values = new ContentValues(); //更新name values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, newName); contentResolver.update( DataUri, values, ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " + ContactsContract.RawContacts.Data.MIMETYPE + "=?", new String[]{ personID, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}); values.clear();// Log.i("test", "name更新完成"); //更新num values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, newNum); contentResolver.update( DataUri, values, ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " + ContactsContract.RawContacts.Data.MIMETYPE + "=?", new String[]{ personID, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}); values.clear();// Log.i("test", "num更新完成"); //更新email values.put(ContactsContract.CommonDataKinds.Email.DATA, newEmail); contentResolver.update( DataUri, values, ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " + ContactsContract.RawContacts.Data.MIMETYPE + "=?", new String[]{ personID, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}); values.clear();// Log.i("test", "email更新完成"); //更新icon values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, newIcon); contentResolver.update( DataUri, values, ContactsContract.RawContacts.Data.RAW_CONTACT_ID + "=? and " + ContactsContract.RawContacts.Data.MIMETYPE + "=?", new String[]{ personID, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE}); values.clear();// Log.i("test", "photo更新完成"); } /** * 弹出对话框,是否删除该联系人 * */ public void showMyDialog(){ //创建对话框 AlertDialog.Builder dialog = new AlertDialog.Builder(OneContact.this); //设置标题 dialog.setTitle("确认删除"); //设置信息 dialog.setMessage("是否删除本联系人信息?"); //设置确认按钮点击事件 dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //点击对话框的确定后,删除该信息 //根据联系人id,删除联系人 contentResolver = getContentResolver(); Uri uri = Uri.withAppendedPath(ContactsContract.RawContacts.CONTENT_URI, personID);// Log.i("test", "要删除的联系人id" + personID); contentResolver.delete(uri, null, null);// Log.i("test", "删除成功"); //直接返回Contacts界面,重新从数据库中加载listview(因为删除了一个联系人) Intent contactsIntent = new Intent(OneContact.this, Contacts.class); startActivity(contactsIntent); } }); //设置取消按钮点击事件 dialog.setNegativeButton("取消", null); //显示对话框 dialog.show(); }}
然后是获取某个手机号码的归属地
/** * Created by lee on 2016/10/25. */public class LocationActivity extends Activity{ /** * 初始化控件 * */ private TextView province, city, supplier, suit; private Button query; private EditText phoneNumber; /** * handler * */ private android.os.Handler handler = new android.os.Handler(){ public void handleMessage(Message message){ String[] result = (String[])message.obj; String supplierName = result[0]; String provinceName = result[1]; String cityName = result[2]; String suitName = result[3]; //更新ui province.setText(provinceName); city.setText(cityName); supplier.setText(supplierName); suit.setText(suitName); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_phone_number); province = (TextView) findViewById(R.id.province); city = (TextView)findViewById(R.id.city); supplier = (TextView)findViewById(R.id.supplier); suit = (TextView)findViewById(R.id.suit); query = (Button)findViewById(R.id.query); phoneNumber = (EditText)findViewById(R.id.phone_number); /** * 手机号码 * */ final String number = getIntent().getStringExtra("number"); /** * 显示归属地 * */ phoneNumber.setText(number); queryPhoneNumberLocation(number); /** * 点击之后查询 * */ query.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String number = String.valueOf(phoneNumber.getText()); queryPhoneNumberLocation(number); } }); } public void queryPhoneNumberLocation(String number){ String address = "http://apis.baidu.com/apistore/mobilenumber/mobilenumber?phone="; if (number.length()==11){ HttpRequest.httpRequest(address + number, new HttpCallBackListener() { @Override public void onFinish(String response) { String[] result = new MyUtil().handleJSON(response); Message message = new Message(); message.obj = result; handler.sendMessage(message); } @Override public void onError(Exception e) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(LocationActivity.this, "查询失败", Toast.LENGTH_SHORT).show(); } }); } }); }else{ province.setText("请输入正确的手机号码!"); city.setText(""); supplier.setText(""); suit.setText(""); } }}
然后是HttpConnection,连接服务器,获取某个号码的归属地
/** * Created by lee on 2016/10/25. */public class HttpRequest { public static void httpRequest(final String address, final HttpCallBackListener listener){ new Thread(new Runnable() { @Override public void run() { URL url; HttpURLConnection connection = null; try { url = new URL(address); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("apikey", "a7146a37e0da2251ab00d9ea7c64cd66"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); InputStream inputStream = connection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = null; StringBuilder response = new StringBuilder(); while((line = bufferedReader.readLine())!=null){ response.append(line); } if (listener != null){ listener.onFinish(response.toString()); } } catch (Exception e) { if (listener!=null){ listener.onError(e); } } finally { connection.disconnect(); } } }).start(); }}
然后是HttpCallBackListener接口,回调机制
public interface HttpCallBackListener { public void onFinish(String response); public void onError(Exception e);}
然后是工具类,对服务器返回的json数据进行解析
/** * Created by lee on 2016/10/25. */public class MyUtil { public String[] handleJSON(String response){ String[] array = null; try { JSONObject jsonObject = new JSONObject(response); JSONObject subObject = jsonObject.getJSONObject("retData"); String supplier = subObject.getString("supplier"); String province = subObject.getString("province"); String city = subObject.getString("city"); String suit = subObject.getString("suit"); array = new String[]{supplier,province,city,suit}; } catch (JSONException e) { e.printStackTrace(); } return array; }}
接下来就是界面
首先是展示所有联系人的一个界面,通过listview展示
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Contacts" android:orientation="vertical"> <LinearLayout android:paddingTop="15dp" android:paddingBottom="15dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/serch" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="8" android:paddingLeft="10dp"/> <Button android:id="@+id/bt_serch" android:layout_width="0dp" android:layout_height="40dp" android:layout_weight="2" android:text="搜索" android:paddingLeft="10dp"/> </LinearLayout> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="20dp"></ListView></LinearLayout>
然后是具体展示某个联系人相信信息的界面。这个界面控件有点多,因为不仅仅要展示信息,通过编辑按钮,还要编辑信息。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/iv_icon" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:paddingTop="10dp"/> <ImageView android:id="@+id/edit_icon" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:paddingTop="10dp" android:visibility="gone"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"></LinearLayout> <LinearLayout android:id="@+id/linera_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="10dp"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/name" android:paddingLeft="20dp"/> <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="40sp" android:paddingLeft="20dp"/> </LinearLayout> <LinearLayout android:id="@+id/edit_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="姓名:"/> <EditText android:id="@+id/et_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:paddingLeft="10dp" android:hint="请输入姓名"/> </LinearLayout> <LinearLayout android:id="@+id/linear_num" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="10dp"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/number" android:paddingLeft="20dp"/> <TextView android:id="@+id/tv_num" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="30sp" android:paddingLeft="20dp"/> <Button android:id="@+id/serch_location" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="归属地" android:gravity="center"/> </LinearLayout> <LinearLayout android:id="@+id/edit_num" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="号码:"/> <EditText android:id="@+id/et_num" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:paddingLeft="10dp" android:hint="请输入号码"/> </LinearLayout> <LinearLayout android:id="@+id/linear_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="10dp"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:background="@drawable/email" android:paddingLeft="20dp"/> <TextView android:id="@+id/tv_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="30sp" android:paddingLeft="20dp"/> </LinearLayout> <LinearLayout android:id="@+id/edit_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="邮箱:"/> <EditText android:id="@+id/et_email" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:hint="请输入邮箱地址" android:paddingLeft="10dp"/> </LinearLayout> <Button android:id="@+id/bt_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:visibility="gone" android:text="确认"/> <LinearLayout android:id="@+id/linear_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="20dp" android:paddingLeft="20dp" android:paddingRight="20dp"> <Button android:id="@+id/bt_edit" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" android:text="编辑" android:paddingLeft="20dp"/> <Button android:id="@+id/bt_delete" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="20sp" android:text="删除" android:paddingLeft="20dp" android:paddingRight="20dp" /> </LinearLayout></LinearLayout>
然后是查询号码归属地的界面,这个界面很简单。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical"> <EditText android:id="@+id/phone_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入要查询的手机号" android:textSize="24sp"/> <Button android:id="@+id/query" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="查询" android:textSize="24sp"/> <TextView android:id="@+id/province" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp"/> <TextView android:id="@+id/city" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp"/> <TextView android:id="@+id/supplier" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp"/> <TextView android:id="@+id/suit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp"/></LinearLayout>
最后是各种权限
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.INTERNET"/>
- Android学习之一:通讯录
- android学习笔记简单通讯录
- Android开发之一个简单的通讯录实现(源码)
- 通讯录之一Transform动画
- android Application学习之一
- android 学习笔记之一
- Android 学习之一
- android 学习记录之一
- Android学习笔记之一
- Android学习地址之一
- android中读取通讯录学习笔记
- Android学习之联系人PinnedHeaderListView(通讯录)
- android 通讯录
- Android通讯录
- android通讯录
- Android通讯录
- Android 通讯录
- Android 通讯录
- LeetCode No.437 Path Sum III
- 回溯
- Html5为什么只需要写<!doctype html>?
- Java Number类
- PHP魔术方法之__set_state()
- Android学习之一:通讯录
- 161025
- CodeForces 643E
- ffmpeg中文文档
- mysql时间存储用什么类型
- LeetCode 151 Reverse Words in a String (字符串处理 推荐)
- Win10开发7
- 面向对象(基础篇)
- Bootstrap 栅格系统