android通讯录之联系人
2016-06-11 13:35
288 查看
之前做了一个基于android的通讯录,借鉴一些别人的开源代码加上了一些自己的理解和想法,在这里做一个总结以便记忆以及以后的使用
![](https://img-blog.csdn.net/20160611133838142?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
抱歉由于使用的是真机测试,所以涉及到一些不方便的地方,所以不得不做一些修饰,这是联系人的主界面。
点击listView,弹出窗口,进行一些操作。
![](https://img-blog.csdn.net/20160611134558087?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是部分效果图。
=======================================
下面是代码的实现。
界面布局
1、主界面(activity_contacts_view.xml)
<?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" >
<RelativeLayout
android:id="@+id/Re"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#c0c0c0"
android:orientation="vertical" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="联系人"
android:textColor="#000"
android:textSize="30dip"></TextView>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/text"
android:layout_marginLeft="90dip"
android:layout_marginTop="8dip"
android:background="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"/>
</RelativeLayout>
<com.example.search.SearchView
android:id="@+id/main_search_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff666666">
</com.example.search.SearchView>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/Re"
android:background="#ff666666" >
</ListView>
<ImageButton
android:id="@+id/ib_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:background="@drawable/btn_bg_ring_add"
android:padding="20dp"
android:src="@drawable/add_contact"/>
<com.example.telephone.QuickAlphabeticBar
android:id="@+id/fast_scroller"
android:layout_width="22dp"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_below="@+id/Re"
android:layout_gravity="top|right|center"
android:layout_marginTop="0dip"
android:background="@null"
android:scaleType="centerInside"/>
</FrameLayout>
</LinearLayout>activity_contacts.xml
4、布局(huachu_item)
<span style="font-size:10px;">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(){
@Override
public 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(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent 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;
}
@Override
public 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();
}
}
</span>
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();
}
}
上述代码并不完整,还有一些布局及资源文件这里就不贴了,需要的请下载源代码,下载链接会在接下来的文章中贴出。
抱歉由于使用的是真机测试,所以涉及到一些不方便的地方,所以不得不做一些修饰,这是联系人的主界面。
点击listView,弹出窗口,进行一些操作。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是部分效果图。
=======================================
下面是代码的实现。
界面布局
1、主界面(activity_contacts_view.xml)
<?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" >
<RelativeLayout
android:id="@+id/Re"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#c0c0c0"
android:orientation="vertical" >
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="联系人"
android:textColor="#000"
android:textSize="30dip"></TextView>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/text"
android:layout_marginLeft="90dip"
android:layout_marginTop="8dip"
android:background="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"/>
</RelativeLayout>
<com.example.search.SearchView
android:id="@+id/main_search_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff666666">
</com.example.search.SearchView>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/Re"
android:background="#ff666666" >
</ListView>
<ImageButton
android:id="@+id/ib_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:background="@drawable/btn_bg_ring_add"
android:padding="20dp"
android:src="@drawable/add_contact"/>
<com.example.telephone.QuickAlphabeticBar
android:id="@+id/fast_scroller"
android:layout_width="22dp"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_below="@+id/Re"
android:layout_gravity="top|right|center"
android:layout_marginTop="0dip"
android:background="@null"
android:scaleType="centerInside"/>
</FrameLayout>
</LinearLayout>activity_contacts.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView a 4000 ndroid:id="@+id/color_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="4dip" android:src="@android:drawable/dialog_frame" /> <TextView android:id="@+id/color_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_toRightOf="@+id/color_image" android:layout_alignParentTop="true" android:layout_marginTop="2dip" android:layout_marginLeft="10dip" android:singleLine="true" android:ellipsize="marquee" android:textSize="20dip" /> <TextView android:id="@+id/color_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/color_image" android:layout_below="@+id/color_title" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginLeft="10dip" android:singleLine="true" android:ellipsize="marquee" android:textSize="15dip" /> </RelativeLayout>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<String> mContactsName = new ArrayList<String>(); /**联系人名称**/ private ArrayList<String> mContactsNumber = new ArrayList<String>(); /**联系人号码**/ private ArrayList<Bitmap> mContactsPhonto = new ArrayList<Bitmap>();/**联系人头像**/ private ArrayList<Long> mContactsId = new ArrayList<Long>(); 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; @Override protected 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(){ @Override public void onClick(View v) { // TODO Auto-generated method stub startActivity(new Intent(ContactsActivity.this,SelectPicPopupWindow.class)); } }); mListView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { // TODO Auto-generated method stub new AlertDialog.Builder(mContext) .setTitle("请选择") .setItems(new String[] {"拨打电话","编辑","删除","分组"},new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Uri 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() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub Uri 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() { @Override public 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 stub return; } 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; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Bundle bundle = intent.getExtras(); int i = bundle.getInt("i"); mListView.setFilterText(i+""); } } }
<strong><span style="font-size:18px;">3、SelectPopupWindow.java</span></strong>
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(){ @Override public void onClick(View v) { // TODO c617 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(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Intent 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; } @Override public 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)
<span style="font-size:10px;">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(){
@Override
public 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(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent 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;
}
@Override
public 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();
}
}
</span>
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();
}
}
上述代码并不完整,还有一些布局及资源文件这里就不贴了,需要的请下载源代码,下载链接会在接下来的文章中贴出。
相关文章推荐
- Android视图的绘制流程(下)——View的Layout与Draw过程
- Android程序安装后图标不显示
- Android之高德地图定位
- [Android]EventBus-来一趟快速公交初体验[上]
- Android中进程间通信(IPC)方式总结
- Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Zelezny
- AndroidStudio插件GsonFormat快速实现JavaBean
- Android studio 多渠道打包
- Android第三方文件选择器:aFileChooser
- Android第三方文件选择器:aFileChooser
- Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包
- Android drawPath实现QQ拖拽泡泡
- Android TextInputLayout实现注册布局
- android日常开发总结的技术经验60条
- 体验Remix——安卓电脑
- 【Android官方文档】翻译Android官方文档-Activities(一)
- 百度SDK定位
- 2.5.2 Adapter接口及实现类
- MotionEvent 事件解读
- Android学习笔记之SimpleAdapter