之前做了一个基于android的通讯录,借鉴一些别人的开源代码加上了一些自己的理解和想法,在这里做一个总结以便记忆以及以后的使用

抱歉由于使用的是真机测试,所以涉及到一些不方便的地方,所以不得不做一些修饰,这是联系人的主界面。

点击listView,弹出窗口,进行一些操作。


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上是部分效果图。

=======================================

下面是代码的实现。

界面布局

1、主界面(activity_contacts_view.xml)

<?xml version="1.0" encoding="utf-8"?>

       
activity_contacts.xml
                                              
2、ContactsAcivity.java(main_activity):包含了适配器
package com.example.telephone;import java.io.InputStream;import java.lang.Thread.UncaughtExceptionHandler;import java.security.Permission;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.logging.Handler;import javax.security.auth.callback.Callback;import org.xml.sax.helpers.DefaultHandler;import com.example.R;import com.example.SMS.SMSListActivity;import com.example.bohao.CallLogBean;import com.example.bohao.DialAdapter;import com.example.bohao.tonghuajilu;import com.example.service.MyService;import android.app.ActionBar;import android.app.Activity;import android.app.AlertDialog;//import com.example.helloworld.R;import android.app.ListActivity;import android.content.BroadcastReceiver;import android.content.ContentProviderOperation;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.content.Context;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.content.Intent;import android.content.IntentFilter;import android.content.res.Resources;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Color;import android.graphics.PixelFormat;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.BaseBundle;import android.os.Bundle;import android.os.Looper;import android.os.Message;import android.provider.ContactsContract;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.Photo;import android.provider.ContactsContract.CommonDataKinds.StructuredName;import android.provider.ContactsContract.Contacts;import android.provider.ContactsContract.Data;import android.provider.ContactsContract.RawContacts;import android.support.v4.widget.DrawerLayout.LayoutParams;import android.text.TextUtils;import android.util.Log;import android.view.Gravity;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.view.Window;import android.view.WindowManager;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemSelectedListener;import com.example.telephone.QuickAlphabeticBar;import com.example.view.ui.SelectPicPopupWindow;import android.widget.AutoCompleteTextView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ExpandableListView;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.ListView;import android.widget.PopupMenu;import android.widget.PopupWindow;import android.widget.SearchView;import android.widget.Spinner;import android.widget.TextView;import android.widget.Toast;public class ContactsActivity extends  Activity {private final  String TAG="ContactsActivity";     Context mContext = null;         MyListAdapter myAdapter = null;          ListView mListView = null;    private static final String[] PHONES_PROJECTION = new String[] {      /**获取库Phone表字段**/          Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID,Phone.CONTACT_ID };      private static final int PHONES_DISPLAY_NAME_INDEX = 0;               /**联系人显示名称**/       private static final int PHONES_NUMBER_INDEX = 1;                     /**电话号码**/      private static final int PHONES_PHOTO_ID_INDEX = 2;                   /**头像ID**/      private static final int PHONES_CONTACT_ID_INDEX = 3;                 /**联系人的ID**/     private ArrayList mContactsName = new ArrayList();    /**联系人名称**/      private ArrayList mContactsNumber = new ArrayList();  /**联系人号码**/       private ArrayList mContactsPhonto = new ArrayList();/**联系人头像**/    private ArrayList mContactsId = new ArrayList();private Context context; private String  currentSearchTip ;private QuickAlphabeticBar alpha;private MyReceiver receiver=null;protected View popupWindow;protected Object parent;//protected Context self;  PopupWindow popup=null;       @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Log.i(TAG, "onCreate Method is executed");    setContentView(R.layout.activity_contacts_view);    //requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);    mListView = (ListView)this.findViewById(R.id.listView1);    TextView t = (TextView)this.findViewById(R.id.text1);    alpha = (QuickAlphabeticBar)this.mListView.findViewById(R.id.fast_scroller);mContext = this;     ActionBar mActionbar = getActionBar();   myAdapter = new MyListAdapter(this);    mListView.setAdapter(myAdapter);    //getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);    getPhoneContacts();  ImageButton b = (ImageButton) findViewById(R.id.ib_add);b.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {Uri insertUri = android.provider.ContactsContract.Contacts.CONTENT_URI;Intent intent = new Intent(Intent.ACTION_INSERT, insertUri);startActivityForResult(intent, 1008);}});Button b1 = (Button)this.findViewById(R.id.button);b1.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstartActivity(new Intent(ContactsActivity.this,SelectPicPopupWindow.class)); }});mListView.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, final int position, long id) {// TODO Auto-generated method stubnew AlertDialog.Builder(mContext)  .setTitle("请选择")  .setItems(new String[] {"拨打电话","编辑","删除","分组"},new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubUri uri = null;switch(which){case 0:String toPhone = mContactsNumber.get(position);uri = Uri.parse("tel:" + toPhone);Intent it = new Intent(Intent.ACTION_CALL, uri);startActivity(it);break;case 1:Intent intent = new Intent(ContactsActivity.this,ContactsXXActivity.class);startActivity(intent);break;case 2:Delete(mContactsId.get(position), position);break;}}})  .show();  }});    }    private void Delete(final Long long1, final int position){    new AlertDialog.Builder(mContext).setIcon(android.R.drawable.ic_dialog_alert).setTitle("是否删除该联系人")    .setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubUri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,long1);Uri lookupUri = ContactsContract.Contacts.getLookupUri(ContactsActivity.this.getContentResolver(), uri);if(lookupUri != Uri.EMPTY){ContactsActivity.this.getContentResolver().delete(uri, null, null);}myAdapter.remove(position);myAdapter.notifyDataSetChanged();Toast.makeText(ContactsActivity.this, "该联系人已经被删除.", Toast.LENGTH_SHORT).show();}        }).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub}}).show();    }    protected  void onStart(){    super.onStart();    startService(new Intent(ContactsActivity.this,MyService.class));receiver = new MyReceiver();IntentFilter filter = new IntentFilter();filter.addAction("com.example.service.MyService");ContactsActivity.this.registerReceiver(receiver,filter);    Log.i(TAG, "onStart Method is executed");    }    protected void onRestart(){    super.onRestart();        Log.i(TAG, "onRestart Method is executed");    }    protected void onResume(){    super.onResume();    Log.i(TAG, "onResume Method is executed");    }    protected void onStop(){    super.onStop();    Log.i(TAG, "onStop Method is executed");        }    protected void onPause(){    super.onPause();    Log.i(TAG, " onPause Method is executed");        }    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if(1008 == requestCode){getPhoneContacts();}super.onActivityResult(requestCode, resultCode, data);}/**得到手机通讯录联系人信息**/      public void getPhoneContacts() {      ContentResolver resolver = mContext.getContentResolver();      Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null); // 获取手机联系人     if (phoneCursor != null) {          while (phoneCursor.moveToNext()) {          String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  //得到手机号码          if (TextUtils.isEmpty(phoneNumber))                  //当手机号码为空的或者为空字段 跳过当前循环              continue;         String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX); //得到联系人名称         Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);         //得到联系人ID         Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);             //得到联系人头像ID         Bitmap contactPhoto = null;                                           //得到联系人头像Bitamp        if(photoid > 0 ) {                      //photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的         Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);             InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);             contactPhoto = BitmapFactory.decodeStream(input);          }else {              contactPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.ic_a6);          }                  mContactsName.add(contactName);         mContactsNumber.add(phoneNumber);         mContactsPhonto.add(contactPhoto);       mContactsId.add(contactid);               }            phoneCursor.close();      }    }         class MyListAdapter extends BaseAdapter {         public MyListAdapter(Context context) {              mContext = context;          }                public void remove(int position) {// TODO Auto-generated method stubreturn;}public int getCount() {              //设置绘制数量              return mContactsName.size();          }                @Override          public boolean areAllItemsEnabled() {              return false;          }                public Object getItem(int position) {              return position;          }                public long getItemId(int position) {              return position;          }                 public View getView( final int position, View convertView, ViewGroup parent) {              ImageView iamge = null;              TextView title = null;              TextView text = null;                   if (convertView == null || position < mContactsNumber.size()) {              convertView = LayoutInflater.from(mContext).inflate(                  R.layout.activity_contacts, null);                        iamge = (ImageView) convertView.findViewById(R.id.color_image);              title = (TextView) convertView.findViewById(R.id.color_title);              text = (TextView) convertView.findViewById(R.id.color_text);                    }                      //绘制联系人名称              title.setText(mContactsName.get(position));              title.setTextColor(Color.BLACK);            Resources resources = getBaseContext().getResources();            //绘制联系人号码              text.setText(mContactsNumber.get(position));              //绘制联系人头像              //text.setTextColor(Color.WHITE);            text.setTextColor(Color.BLACK);            Resources resources1 = getBaseContext().getResources();            iamge.setImageBitmap(mContactsPhonto.get(position));               return convertView;          }        }    protected void onDestroy(){    stopService(new Intent(ContactsActivity.this,MyService.class));    super.onDestroy();    }    public class MyReceiver extends BroadcastReceiver{protected String CMD_STOP_SERVICE;@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubBundle bundle = intent.getExtras();int i = bundle.getInt("i");mListView.setFilterText(i+"");}        }    }
3、SelectPopupWindow.java
package com.example.view.ui;import com.example.R;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.Toast;public class SelectPicPopupWindow extends Activity implements OnClickListener{ private Button btn_take_photo; private Button btn_pick_photo; private Button btn_cancel;      private LinearLayout layout;private Button btn_yy; protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.huachu_item);          btn_take_photo = (Button) this.findViewById(R.id.tp);         btn_pick_photo = (Button) this.findViewById(R.id.pp);          btn_cancel = (Button) this.findViewById(R.id.bc);           btn_yy = (Button)this.findViewById(R.id.yy);        layout=(LinearLayout)findViewById(R.id.pop_layout);        layout.setOnClickListener(new OnClickListener() {                            public void onClick(View v) {                  // TODO Auto-generated method stub                  Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",                           Toast.LENGTH_SHORT).show();               }          });          //添加按钮监听          btn_cancel.setOnClickListener(this);                     btn_take_photo.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stub Intent i = new Intent("android.media.action.IMAGE_CAPTURE");                    startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);    }                });          btn_pick_photo.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent picture = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(picture, 1);}                  });    btn_yy.setOnClickListener(new View.OnClickListener(){  @Override  public void onClick(View v) {  // TODO Auto-generated method stub//   Intent intent = new Intent(Intent.ACTION_PICK);//   intent.setDataAndType(Uri.EMPTY,"vnd.android.cursor.dir/playlist");//   intent.putExtra("withtabs", true);//   intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//   Intent j = Intent.createChooser(intent, "Choose an application to open with:");//   if(j == intent){//   startActivity(j);//   }else{//   Intent intent_1 = new Intent("android.intent.action.MUSIC_PLAYER");//   startActivity(intent_1);//   }  Intent intent_music = new Intent(Intent.ACTION_PICK);    intent_music.setDataAndType(Uri.EMPTY,"vnd.android.cursor.dir/playlist");    intent_music.putExtra("withtabs", true); // 显示tab选项卡    intent_music.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);    startActivity(intent_music);  }          });} //实现onTouchEvent触屏函数但点击屏幕时销毁本Activity      @Override      public boolean onTouchEvent(MotionEvent event){          finish();          return true;      }  @Overridepublic void onClick(View v) {// TODO Auto-generated method stub switch (v.getId()) {          case R.id.tp:              break;          case R.id.pp:                             break;          case R.id.bc:                             break;          default:              break;          }          finish();      }  }

4、布局(huachu_item)

package com.example.view.ui;import com.example.R;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.LinearLayout;import android.widget.Toast;public class SelectPicPopupWindow extends Activity implements OnClickListener{ private Button btn_take_photo; private Button btn_pick_photo; private Button btn_cancel;      private LinearLayout layout;private Button btn_yy; protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.huachu_item);          btn_take_photo = (Button) this.findViewById(R.id.tp);         btn_pick_photo = (Button) this.findViewById(R.id.pp);          btn_cancel = (Button) this.findViewById(R.id.bc);           btn_yy = (Button)this.findViewById(R.id.yy);        layout=(LinearLayout)findViewById(R.id.pop_layout);        layout.setOnClickListener(new OnClickListener() {                            public void onClick(View v) {                  // TODO Auto-generated method stub                  Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",                           Toast.LENGTH_SHORT).show();               }          });          //添加按钮监听          btn_cancel.setOnClickListener(this);                     btn_take_photo.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stub Intent i = new Intent("android.media.action.IMAGE_CAPTURE");                    startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);    }                });          btn_pick_photo.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent picture = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(picture, 1);}                  });    btn_yy.setOnClickListener(new View.OnClickListener(){  @Override  public void onClick(View v) {  // TODO Auto-generated method stub//   Intent intent = new Intent(Intent.ACTION_PICK);//   intent.setDataAndType(Uri.EMPTY,"vnd.android.cursor.dir/playlist");//   intent.putExtra("withtabs", true);//   intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//   Intent j = Intent.createChooser(intent, "Choose an application to open with:");//   if(j == intent){//   startActivity(j);//   }else{//   Intent intent_1 = new Intent("android.intent.action.MUSIC_PLAYER");//   startActivity(intent_1);//   }  Intent intent_music = new Intent(Intent.ACTION_PICK);    intent_music.setDataAndType(Uri.EMPTY,"vnd.android.cursor.dir/playlist");    intent_music.putExtra("withtabs", true); // 显示tab选项卡    intent_music.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);    startActivity(intent_music);  }          });} //实现onTouchEvent触屏函数但点击屏幕时销毁本Activity      @Override      public boolean onTouchEvent(MotionEvent event){          finish();          return true;      }  @Overridepublic void onClick(View v) {// TODO Auto-generated method stub switch (v.getId()) {          case R.id.tp:              break;          case R.id.pp:                             break;          case R.id.bc:                             break;          default:              break;          }          finish();      }  }


4、QuickAlphabeticBa.java(这部分是根据别人的开源代码写的,参考)

package com.example.telephone;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;public class QuickAlphabeticBar extends View{public QuickAlphabeticBar(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}// 字母表中的字符private String alphabet[] = { "#", "A", "B", "C", "D", "E", "F", "G", "H","I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V", "W", "X", "Y", "Z", "#", };// 字母的颜色private int defaultColor = Color.RED;private int selectColor = Color.BLUE;// 被选中的字符private int selectedIndex = 0;// 画笔--用于绘制右侧字母Paint paint = new Paint();// 选中的字母被改变监听器private OnTouchLetterChangedListener changedListener;// 选中的字母被释放监听器private OnTouchLetterReleasedListener releasedListener;protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 获取当前View的宽度和高度int width = getWidth();// 计算单个字符所占高度int singleLetter = getHeight() / (alphabet.length);// 自上而下逐一绘制字母表中的每个字符for (int i = 0; i < alphabet.length; i++) {// 若没有没选中时显示默认颜色,若被选中显示指定的高亮色if (i != selectedIndex) {paint.setColor(defaultColor);paint.setAntiAlias(true);paint.setTextSize(40);} else {paint.setTextSize(40);paint.setColor(selectColor);}// 计算第i个字符在屏幕中的位置(x,y)float x = width / 2 - paint.measureText(alphabet[i]) / 2;float y = singleLetter * (i + 1);// 在指定位置绘制指定字符canvas.drawText(alphabet[i], x, y, paint);// 重置画笔的属性paint.reset();}}// 设置字母表中的字符public void setAlphabet(String[] alphabet) {this.alphabet = alphabet;}// 设置字母默认显示的颜色public void setDefaultColor(int defaultColor) {this.defaultColor = defaultColor;}// 设置字母被选中时显示的颜色public void setSelectColor(int selectColor) {this.selectColor = selectColor;}// 设置选中字母已改变监听事件public void setOnTouchLetterChangedListener(OnTouchLetterChangedListener changedListener) {this.changedListener = changedListener;}// 设置已释放字母选中监听事件public void setOnTouchLetterReleasedListener(OnTouchLetterReleasedListener releasedListener) {this.releasedListener = releasedListener;}public interface OnTouchLetterChangedListener {public void onTouchLetterChangedListener(String s);}public interface OnTouchLetterReleasedListener {public void onTouchLetterReleasedListener();}}


上述代码并不完整,还有一些布局及资源文件这里就不贴了,需要的请下载源代码,下载链接会在接下来的文章中贴出。

更多相关文章

  1. Android绘制(二):来用Path绘出想要的图形吧!
  2. Android(安卓)实现ListView的点击变色的实例
  3. android中联系人搜索框
  4. Opengl ES系列学习--glDrawArrays API使用
  5. Android自定义View-圆形图片控件
  6. Android(安卓)ViewRootImpl 解析
  7. 【Android(安卓)Developers Training】 64. 绘制形状
  8. 解决Android导入新项目时Android.jar包丢失问题
  9. 17. android dialog —— 单选列表对话框

随机推荐

  1. maven 仓库地址配置大全
  2. 前端面试经典问题:CSS中居中的几种方式
  3. Nacos注册中心 配置启动
  4. Rheem:可扩展且易于使用的跨平台大数据分
  5. 关于图片性能优化,你必须知道的
  6. Flink Table和SQL API:为统一批处理和流处
  7. 手把手教你实现vue下拉菜单组件
  8. 【电子书分享】Learning PySpark下载,包含
  9. 探索emoji字符串长度之谜
  10. Flume+Morphlines实现数据的实时ETL