当前位置: 代码迷 >> Android >> android 通讯录的兑现
  详细解决方案

android 通讯录的兑现

热度:101   发布时间:2016-05-01 17:32:39.0
android 通讯录的实现

    暑假第五十三天,好多天没有更新博客了,貌似这十多天都在一直在关注这奥运会的赛事,现在奥运会结束了,自己也该学习了,看看最近实现的通讯录吧,能实现简单的增加联系人、删除联系人、设置私密账号、点击item可以对该联系人进行通话、调用系统的拨号界面、备份数据、恢复数据简单的功能!然后呢,接着咱就可以看看实现的过程

首先先看一下布局

1。欢迎界面的布局startimage.xml

<?xml version="1.0" encoding="utf-8"?><ImageView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/startimage"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:clickable="true"    android:src="@drawable/welcome" ></ImageView>

2.接着是主界面main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:background="@drawable/bg"    >		<FrameLayout		android:id="@+id/list_ll"		android:layout_width="fill_parent"		android:layout_height="fill_parent"		>		<ListView 		android:id="@+id/lv_userlist" 		android:layout_above="@+id/gv_buttom_menu"		android:layout_width="fill_parent" 		android:layout_height="wrap_content"/>		<!-- <TextView        android:id="@+id/tvLetter"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:background="@drawable/textviewbg"        android:gravity="center"        android:maxWidth="50dp"        android:minWidth="50dp"        android:textColor="#FF6100"        android:textSize="50sp" />     <com.wang.A_Z.ListA_Z        android:id="@+id/myView"        android:layout_width="30dip"        android:layout_height="fill_parent"        android:layout_gravity="right" /> -->							</FrameLayout>			<GridView 		android:id="@+id/gv_buttom_menu" 		android:layout_height="80dp"		android:layout_width="fill_parent" 		android:layout_alignParentBottom="true"		android:visibility="gone">		</GridView>		<LinearLayout 		android:id="@+id/ll_search"		android:layout_width="fill_parent" 		android:layout_height="wrap_content"		android:layout_centerVertical="true" 		android:layout_alignParentLeft="true"		android:layout_above="@+id/gv_buttom_menu"		android:visibility="gone">		<EditText 			android:id="@+id/et_search" 			android:layout_width="fill_parent"			android:layout_height="wrap_content" 			android:hint="请输入查询的号码或姓名"			android:textSize="18dp">		</EditText>			</LinearLayout></RelativeLayout>
3.接着呢,就是增加联系人的界面布局addnewcontacts.xml

<?xml version="1.0" encoding="UTF-8"?><LinearLayout	xmlns:android="http://schemas.android.com/apk/res/android"	android:layout_width="fill_parent" 	android:layout_height="fill_parent"	android:orientation="vertical">	<ScrollView android:layout_weight="4" 				android:id="@+id/ScrollView1"				android:layout_width="fill_parent" 				android:layout_height="wrap_content"				android:scrollbars="vertical">		<LinearLayout 			xmlns:android="http://schemas.android.com/apk/res/android"			android:layout_width="fill_parent"			android:layout_height="wrap_content"			android:orientation="vertical">			<LinearLayout			android:id="@+id/widget205"			android:layout_width="fill_parent"			android:layout_height="wrap_content"			android:layout_marginLeft="10dp"			android:layout_marginRight="10dp"			>								<ImageButton				android:id="@+id/image_button"				android:layout_width="60px"				android:layout_height="60px"				android:src="@drawable/icon"				android:scaleType="centerCrop"				>				</ImageButton>				<EditText 					android:id="@+id/username" 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:scrollbars="vertical"					android:hint="姓名" 					android:gravity="top"					android:layout_gravity="center_vertical"					 />			</LinearLayout>									<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="vertical"				android:layout_marginRight="10dp" 				android:layout_marginLeft="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="手机:"					android:textSize="20dp" />				<EditText 					android:id="@+id/mobilephone"					android:layout_width="fill_parent" 					android:layout_height="wrap_content"					android:scrollbars="vertical" 					android:gravity="top" 					android:hint="手机"					android:phoneNumber="true" />			</LinearLayout>			<LinearLayout 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:orientation="vertical"					android:layout_marginLeft="10dp" 					android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="办公室电话:"					android:textSize="20dp" />				<EditText 					android:id="@+id/officephone"					android:layout_width="fill_parent" 					android:layout_height="wrap_content"					android:scrollbars="vertical" 					android:phoneNumber="true"					android:hint="办公室电话" 					android:gravity="top" />			</LinearLayout>			<LinearLayout 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:orientation="vertical"					android:layout_marginLeft="10dp" 					android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="家庭电话:"					android:textSize="20dp" />				<EditText 					android:id="@+id/familyphone"					android:layout_width="fill_parent" 					android:layout_height="wrap_content"					android:scrollbars="vertical" 					android:phoneNumber="true"					android:hint="家庭电话" 					android:gravity="top" />			</LinearLayout>			<LinearLayout 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:orientation="vertical"					android:layout_marginLeft="10dp" 					android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="职务职称:"					android:textSize="20dp" />				<EditText 					android:id="@+id/position" 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:scrollbars="vertical"					android:hint="职务职称" 					android:gravity="top" />			</LinearLayout>											<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="vertical"				android:layout_marginLeft="10dp" 				android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="单位名称:"					android:textSize="20dp" />				<EditText 					android:id="@+id/company" 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:scrollbars="vertical"					android:hint="单位名称" 					android:gravity="top" />			</LinearLayout>			<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="vertical"				android:layout_marginLeft="10dp" 				android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="地址:"					android:textSize="20dp" />				<EditText 					android:id="@+id/address"					android:layout_width="fill_parent" 					android:layout_height="wrap_content"					android:scrollbars="vertical" 					android:hint="地址" 					android:gravity="top" />			</LinearLayout>			<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="vertical"				android:layout_marginLeft="10dp" 				android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="邮政编码:"					android:textSize="20dp" />				<EditText 					android:id="@+id/zipcode"					android:layout_width="fill_parent" 					android:layout_height="wrap_content"					android:scrollbars="vertical" 					android:hint="邮政编码" 					android:gravity="top" />			</LinearLayout>			<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="vertical"				android:layout_marginLeft="10dp" 				android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="E-mail:"					android:textSize="20dp" />				<EditText 					android:id="@+id/email" 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:scrollbars="vertical"					android:hint="E-mail" android:gravity="top" />			</LinearLayout>						<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="vertical"				android:layout_marginLeft="10dp" 				android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="其他联系方式:"					android:textSize="20dp" />				<EditText 					android:id="@+id/othercontact"					android:layout_width="fill_parent" 					android:layout_height="wrap_content"					android:scrollbars="vertical" 					android:hint="其他联系方式"					android:gravity="top" />			</LinearLayout>			<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="vertical"				android:layout_marginLeft="10dp" 				android:layout_marginRight="10dp">				<TextView 					android:layout_height="wrap_content"					android:layout_width="wrap_content" 					android:text="备注:"					android:textSize="20dp" />				<EditText android:id="@+id/remark" 					android:layout_width="fill_parent"					android:layout_height="wrap_content" 					android:scrollbars="vertical"					android:hint="备注" android:gravity="top" />			</LinearLayout>		</LinearLayout>	</ScrollView>	<LinearLayout 				android:layout_width="fill_parent"				android:layout_height="wrap_content" 				android:orientation="horizontal"				android:layout_marginLeft="10dp" 				android:layout_marginRight="10dp">	<Button 		android:id="@+id/save"		android:layout_width="wrap_content"		android:layout_height="wrap_content" 		android:layout_weight="1"		android:text="保存"/>		<Button 		android:id="@+id/btn_return"		android:layout_width="wrap_content"		android:layout_height="wrap_content" 		android:layout_weight="1"		android:text="返回"/>		</LinearLayout></LinearLayout>

4.接着是图片选择的对话框界面的imageswitch.xml的布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/widget34"    android:layout_width="fill_parent"    android:layout_height="fill_parent" >    <Gallery        android:id="@+id/gallery"        android:layout_width="fill_parent"        android:layout_height="110px"        android:layout_alignParentLeft="true"        android:layout_marginTop="10px" >    </Gallery>    <ImageSwitcher        android:id="@+id/imageswitch"        android:layout_width="90px"        android:layout_height="90px"        android:layout_alignBottom="@+id/gallery"        android:layout_alignParentTop="true"        android:layout_centerHorizontal="true" >    </ImageSwitcher></RelativeLayout>
5.接着是list列表的界面listitem.xml的布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/widget33"    android:layout_width="fill_parent"    android:layout_height="wrap_content" >    <ImageView        android:id="@+id/user_image"        android:layout_width="50px"        android:layout_height="53px"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true" >    </ImageView>    <LinearLayout        android:id="@+id/linerlayout"        android:layout_width="fill_parent"        android:layout_height="53px"        android:layout_alignParentRight="true"        android:layout_alignParentTop="true"        android:layout_toRightOf="@+id/user_image"        android:orientation="vertical" >        <LinearLayout            android:layout_width="fill_parent"            android:layout_height="25px"            android:orientation="horizontal" >            <TextView                android:id="@+id/tv_showname"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_weight="1"                android:gravity="top"                android:text="姓名:"                android:textColor="#000000"                android:textSize="17sp" />            <TextView                android:id="@+id/tv_name"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_weight="7"                android:gravity="left"                android:textColor="#000000"                android:textSize="17sp" />        </LinearLayout>        <LinearLayout            android:layout_width="fill_parent"            android:layout_height="25px"            android:orientation="horizontal" >            <TextView                android:id="@+id/tv_showmobilephone"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_weight="1"                android:gravity="left"                android:text="手机:"                android:textColor="#000000"                android:textSize="17sp" />            <TextView                android:id="@+id/tv_mobilephone"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_weight="7"                android:gravity="left"                android:textColor="#000000"                android:textSize="20sp" />        </LinearLayout>    </LinearLayout>    <ImageView        android:id="@+id/user_mark"        android:layout_width="60px"        android:layout_height="15px"        android:layout_alignParentRight="true"        android:layout_alignParentTop="true"        android:src="@drawable/checkmark"        android:visibility="gone" /></RelativeLayout>
6.接下来是点击menu键的item_menu.xml的布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/RelativeLayout_Item"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:paddingBottom="5dip" >    <ImageView        android:id="@+id/item_image"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true" >    </ImageView>    <TextView        android:id="@+id/item_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/item_image"        android:layout_centerHorizontal="true" >    </TextView></RelativeLayout>

7.然后是在点击menu键后,点击item_menu上的监听事件查找电话号码的numchoose.xml 的布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/widget28"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/tv_numchoose"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:text="请选择一个号码"        android:textSize="17sp"        android:typeface="serif" >    </TextView>    <ListView        android:id="@+id/num_list"        android:layout_width="fill_parent"        android:layout_height="wrap_content" >    </ListView></LinearLayout>

8.接着是在点击menu键后,点击item_menu上的监听事件管理通讯录的监听事件main_menu_grid.xml的布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    ><GridView         android:id="@+id/gridview"         android:layout_width="fill_parent"         android:layout_height="fill_parent"         android:numColumns="2"         android:verticalSpacing="10dip"         android:horizontalSpacing="10dip"         android:stretchMode="columnWidth"         android:gravity="center"         />  </LinearLayout>
9.接着是在点击menu键后,点击item_menu上的监听事件管理备份文件夹的名称enterfilename.xml的布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/widget29"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/tv_enter_file_name"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="请输入备份文件的文件名\n该文件该置于SD卡的根目录zpContact文件夹下" >    </TextView>    <EditText        android:id="@+id/et_enter_file_name"        android:layout_width="fill_parent"        android:layout_height="wrap_content" >    </EditText></LinearLayout>

10.接着是一个备份时候进度条的布局backup_progress.xml的布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/widget29"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <ProgressBar        android:id="@+id/pb_backup"        style="?android:attr/progressBarStyleHorizontal"        android:layout_width="fill_parent"        android:layout_height="wrap_content" >    </ProgressBar>    <Button        android:id="@+id/btn_backuup_ok"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:gravity="center_horizontal"        android:text="OK"        android:visibility="gone" >    </Button></LinearLayout>

11.接着呢就是5s钟的欢迎界面 startAnimation.java

package com.wang.Activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.view.View.OnClickListener;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.Animation.AnimationListener;import android.widget.ImageView;public class startAnimation extends Activity {	ImageView startimage;	AlphaAnimation startAnimation;	protected void onCreate(Bundle savedInstanceState) {		// 去除标题		this.requestWindowFeature(Window.FEATURE_NO_TITLE);		// 取消状态栏,充满全屏		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,				WindowManager.LayoutParams.FLAG_FULLSCREEN);		super.onCreate(savedInstanceState);		setContentView(R.layout.startimage);		startimage = (ImageView) findViewById(R.id.startimage);		// 设置动画的渐变效果逐渐增强		startAnimation = new AlphaAnimation(0.0f, 1.0f);		// 设置动画显示的时间为3s		startAnimation.setDuration(5000);		// 开始动画效果		startimage.startAnimation(startAnimation);		// 为动画效果设置监听事件		startAnimation.setAnimationListener(new AnimationListener() {			// ka开始			@Override			public void onAnimationStart(Animation animation) {				// TODO Auto-generated method stub			}			// 重复			@Override			public void onAnimationRepeat(Animation animation) {				// TODO Auto-generated method stub			}			// 动画结束			@Override			public void onAnimationEnd(Animation animation) {				// 声明一个意图,启动一个新的Activity				Intent intent = new Intent(startAnimation.this,						AddressPhoneBookDemoActivity.class);				// 启动新的Activity				startActivity(intent);			}		});		// 当点击图片的时候也可以进行跳转		startimage.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				// TODO Auto-generated method stub				Intent intent = new Intent(startAnimation.this,						AddressPhoneBookDemoActivity.class);				// 启动新的Activity				startActivity(intent);			}		});	}}

12.然后就是跳转到主界面实现过程AddressPhoneBookDemoActivity.java

package com.wang.Activity;import java.util.ArrayList;import java.util.HashMap;import com.wang.Db.DBHelper;import com.wang.UserInfo.UserInfo;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Color;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Bundle;import android.view.Gravity;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.view.View.OnClickListener;import android.view.View.OnKeyListener;import android.widget.AdapterView;import android.widget.Button;import android.widget.EditText;import android.widget.FrameLayout;import android.widget.GridView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.RelativeLayout;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemLongClickListener;public class AddressPhoneBookDemoActivity extends Activity {	// 显示所有数据的ListView	ListView lv;	ArrayList list;	// 拥有所有数据的Adapter	SimpleAdapter adapter;	// 屏幕下方的工具栏	GridView bottomMenuGrid;	// 主菜单的布局	GridView mainMenuGrid;	// 主菜单的视图	View mainMenuView;	// 装搜索框的linearlayout,默认情况下visibility=gone	LinearLayout searchLinearout;	FrameLayout mainLinearLayout;	// 搜索框	EditText et_search;	EditText et_enter_file_name;	// 主菜单的对话框	AlertDialog mainMenuDialog;	// 确认对话框	AlertDialog confirmDialog;	// 进度条对话框	AlertDialog progressDialog;	// 输入文件名的对话框	AlertDialog enterFileNameDialog;	// 表示保密状态	boolean privacy = false;	// 存储标记的数目	int markedNum;	// 存储标记条目的_id号	ArrayList<Integer> deleteId;	// 关键界面的文字	String[] main_menu_itemName = { "显示所有", "删除所有", "备份数据", "还原数据", };	// 管理界面的图片资源	int[] main_menu_itemSource = { R.drawable.showall, R.drawable.delete,			R.drawable.menu_backup, R.drawable.menu_restore, };	String[] bottom_menu_itemName = { "增加", "查找", "删除", "管理", "拨号" };	String fileName;	// menu 的图片资源	int[] bottom_menu_itemSource = { R.drawable.addphone, R.drawable.search,			R.drawable.delete, R.drawable.manager, R.drawable.callphone };	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		// 去除标题		this.requestWindowFeature(Window.FEATURE_NO_TITLE);		// 取消状态栏,充满全屏		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,				WindowManager.LayoutParams.FLAG_FULLSCREEN);		setContentView(R.layout.main);		// 实例化组件		mainLinearLayout = (FrameLayout) findViewById(R.id.list_ll);		DBHelper helper = new DBHelper(this);		// 打开数据库,就打开这一次,因为Helper中的SQLiteDatabase是静态的。		helper.openDatabase();		// 拿到所有保密状态为privacy的用户的list		list = helper.getAllUser(privacy);		lv = (ListView) findViewById(R.id.lv_userlist);		// 当通讯录中没有信息的时候		if (list.size() == 0) {			Drawable nodata_bg = getResources().getDrawable(					R.drawable.nodata_bg);			mainLinearLayout.setBackgroundDrawable(nodata_bg);			setTitle("没有查到任何数据");		}		// 将数据与adapter集合起来		adapter = new SimpleAdapter(this, list, R.layout.listitem,				new String[] { "imageid", "name", "mobilephone" }, new int[] {						R.id.user_image, R.id.tv_name, R.id.tv_mobilephone });		// 将整合好的adapter交给listview,显示给用户看		lv.setAdapter(adapter);		// 当点击item时候,调用系统进行拨号		lv.setOnItemClickListener(new OnItemClickListener() {			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,					long arg3) {				// 得到item位置				HashMap item = (HashMap) arg0.getItemAtPosition(arg2);				// 得到item上的手机号				String number = String.valueOf(item.get("mobilephone"))						.toString();				// 声明一个意图,调用系统的打电话程序				Intent intent = new Intent();				intent.setAction("android.intent.action.CALL");				// 调用系统打电话必须+tel:				intent.setData(Uri.parse("tel:" + number));				startActivity(intent);			}		});		// 设置ListView的背景为透明		lv.setCacheColorHint(Color.TRANSPARENT);		// 长按时间处理可以选中这样才可以删除联系人		lv.setOnItemLongClickListener(new OnItemLongClickListener() {			@Override			public boolean onItemLongClick(AdapterView<?> arg0, View arg1,					int arg2, long arg3) {				if (deleteId == null) {					deleteId = new ArrayList<Integer>();				}				// 得到item的位置 _id				HashMap item = (HashMap) arg0.getItemAtPosition(arg2);				Integer _id = Integer.parseInt(String.valueOf(item.get("_id")));				RelativeLayout r = (RelativeLayout) arg1;				ImageView markedView = (ImageView) r.getChildAt(2);				if (markedView.getVisibility() == View.VISIBLE) {					markedView.setVisibility(View.GONE);					deleteId.remove(_id);				} else {					markedView.setVisibility(View.VISIBLE);					deleteId.add(_id);				}				return true;			}		});		// 为list添加item设置背景颜色		Drawable itembg = getResources().getDrawable(R.drawable.itembg);		lv.setSelector(itembg);	}	/*****	 * 点击menu键的处理事件	 * 	 * *	 **/	@Override	public boolean onKeyDown(int keyCode, KeyEvent event) {		if (keyCode == KeyEvent.KEYCODE_MENU) {			loadBottomMenu();			if (bottomMenuGrid.getVisibility() == View.VISIBLE) {				if (searchLinearout != null						&& searchLinearout.getVisibility() == View.VISIBLE) {					searchLinearout.setVisibility(View.GONE);				}				bottomMenuGrid.setVisibility(View.GONE);			} else {				bottomMenuGrid.setVisibility(View.VISIBLE);			}		}		return super.onKeyDown(keyCode, event);	}	/*****	 * 底部menu的item的处理	 * 	 * *	 **/	private void loadBottomMenu() {		if (bottomMenuGrid == null) {			// 设置menuitem的布局,实力化组件			bottomMenuGrid = (GridView) findViewById(R.id.gv_buttom_menu);			// 设置背景			bottomMenuGrid.setBackgroundResource(R.drawable.item);			// 设置每行列数			bottomMenuGrid.setNumColumns(5);			// 位置居中			bottomMenuGrid.setGravity(Gravity.CENTER);			// 垂直间隔			bottomMenuGrid.setVerticalSpacing(10);			// 水平间隔			bottomMenuGrid.setHorizontalSpacing(10);			// 设置菜单Adapter			bottomMenuGrid.setAdapter(getMenuAdapter(bottom_menu_itemName,					bottom_menu_itemSource));			// / 监听底部菜单menu选项 的时间			bottomMenuGrid.setOnItemClickListener(new OnItemClickListener() {				public void onItemClick(AdapterView<?> arg0, View arg1, int id,						long arg3) {					switch (id) {					case 0: {						// 如果查找框不为空,并且查找框可见,则设置为不可见						if (searchLinearout != null								&& searchLinearout.getVisibility() == View.VISIBLE) {							searchLinearout.setVisibility(View.GONE);						}						if (bottomMenuGrid.getVisibility() == View.VISIBLE) {							bottomMenuGrid.setVisibility(View.GONE);						}						// 跳转到添加联系人的界面						Intent intent = new Intent(								AddressPhoneBookDemoActivity.this,								AddNewContacts.class);						startActivityForResult(intent, 3);						break;					}					case 1:						// 调用处理查找联系人的方法						loadSearchLinearout();						// ,并且查找框可见,则设置为不可见						if (searchLinearout.getVisibility() == View.VISIBLE) {							searchLinearout.setVisibility(View.GONE);						} else {							searchLinearout.setVisibility(View.VISIBLE);							// 把后面的查找按钮做焦点							et_search.requestFocus();							et_search.selectAll();						}						break;					case 2:						// 删除联系人的方法						// 如果查找框不为空,并且查找框可见,则设置为不可见						if (searchLinearout != null								&& searchLinearout.getVisibility() == View.VISIBLE) {							searchLinearout.setVisibility(View.GONE);						}						if (deleteId == null || deleteId.size() == 0) {							Toast.makeText(AddressPhoneBookDemoActivity.this,									"亲,没有标记任何记录\n长按一条记录即可标记!!",									Toast.LENGTH_LONG).show();						} else {							// 新建一个警告的对话框							new AlertDialog.Builder(									AddressPhoneBookDemoActivity.this)									.setTitle(											"确定要删除标记的" + deleteId.size()													+ "条记录吗?")									.setPositiveButton(											"确定",											// 确定按钮设置监听事件											new DialogInterface.OnClickListener() {												public void onClick(														DialogInterface dialog,														int which) {													DBHelper helper = new DBHelper(															AddressPhoneBookDemoActivity.this);													// 调用数据库的删除函数进行删除记录													helper															.deleteMarked(deleteId);													// 重置视图													list = helper															.getAllUser(privacy);													// 声明一个适配器对象													adapter = new SimpleAdapter(															AddressPhoneBookDemoActivity.this,															list,															R.layout.listitem,															new String[] {																	"imageid",																	"name",																	"mobilephone" },															new int[] {																	R.id.user_image,																	R.id.tv_name,																	R.id.tv_mobilephone });													lv.setAdapter(adapter);													deleteId.clear();												}											}).setNegativeButton("取消", null)									.create().show();						}						break;					case 3:						// 管理的界面						// 如果查找框不为空,并且查找框可见,则设置为不可见						if (searchLinearout != null								&& searchLinearout.getVisibility() == View.VISIBLE) {							searchLinearout.setVisibility(View.GONE);						}						// 调用loadMainMenuDialog的方法实现						loadMainMenuDialog();						mainMenuDialog.show();						break;					case 4:						// 调用系统的打电话的界面						Intent intent = new Intent(								"android.intent.action.CALL_BUTTON");						startActivity(intent);						break;					}				}			});		}	}	/*****	 * 底部管理 功能的实现方法	 * 	 * *	 **/	private void loadMainMenuDialog() {		if (mainMenuDialog == null) {			// 获得LayoutInflater从给定的上下文			LayoutInflater inflater = LayoutInflater.from(this);			mainMenuView = inflater.inflate(R.layout.main_menu_grid, null);			// 根据主菜单视图,创建主菜单对话框			mainMenuDialog = new AlertDialog.Builder(this)					.setView(mainMenuView).create();			// 实例化组件			mainMenuGrid = (GridView) mainMenuView.findViewById(R.id.gridview);			// 根据主菜单视图,获得视图文件中的GridView,然后再往里面放Adapter			SimpleAdapter menuAdapter = getMenuAdapter(main_menu_itemName,					main_menu_itemSource);			mainMenuGrid.setAdapter(menuAdapter);			// 设置管理界面的响应点击事件			mainMenuGrid.setOnItemClickListener(new OnItemClickListener() {				@Override				public void onItemClick(AdapterView<?> arg0, View arg1,						int arg2, long arg3) {					switch (arg2) {					case 0: {						// 显示所有数据						DBHelper helper = new DBHelper(								AddressPhoneBookDemoActivity.this);						list = helper.getAllUser(privacy);						adapter = new SimpleAdapter(								AddressPhoneBookDemoActivity.this, list,								R.layout.listitem, new String[] { "imageid",										"name", "mobilephone" }, new int[] {										R.id.user_image, R.id.tv_name,										R.id.tv_mobilephone });						lv.setAdapter(adapter);						mainMenuDialog.dismiss();						break;					}					case 1: {						// 是否删除所有数据						// 创建一个对话框						AlertDialog.Builder builder = new AlertDialog.Builder(								AddressPhoneBookDemoActivity.this);						confirmDialog = builder.create();						builder.setTitle("是否删除所有!?");						builder.setPositiveButton("确定",						// 确定按钮的监听事件								new DialogInterface.OnClickListener() {									@Override									public void onClick(DialogInterface dialog,											int which) {										DBHelper helper = new DBHelper(												AddressPhoneBookDemoActivity.this);										// 调用删除函数删除所有的数据										helper.deleteAll(0);										list = helper.getAllUser(privacy);										adapter = new SimpleAdapter(												AddressPhoneBookDemoActivity.this,												list,												R.layout.listitem,												new String[] { "imageid",														"name", "mobilephone" },												new int[] { R.id.user_image,														R.id.tv_name,														R.id.tv_mobilephone });										lv.setAdapter(adapter);										mainMenuDialog.dismiss();									}								});						builder.setNegativeButton("取消",						// 取消按钮的监听事件								new DialogInterface.OnClickListener() {									@Override									public void onClick(DialogInterface dialog,											int which) {										// 对话框消失										confirmDialog.dismiss();									}								});						builder.create().show();						break;					}					case 2: {						// 备份通讯录的处理						// 对话框消失,重新新建一个对话框						mainMenuDialog.dismiss();						new AlertDialog.Builder(								AddressPhoneBookDemoActivity.this)								.setTitle("是否需要备份记录到SD卡?")								.setPositiveButton("确定",								// 确定按钮的监听事件										new DialogInterface.OnClickListener() {											@Override											public void onClick(													DialogInterface dialog,													int which) {												LayoutInflater inflater = LayoutInflater														.from(AddressPhoneBookDemoActivity.this);												// 获得一个新的视图层次从指定的xml资源												View backup_view = inflater														.inflate(																R.layout.backup_progress,																null);												// 进度对话框显示												progressDialog = new AlertDialog.Builder(														AddressPhoneBookDemoActivity.this)														.setTitle("备份正在进行中...")														.setView(backup_view)														.create();												progressDialog.show();												DBHelper helper = new DBHelper(														AddressPhoneBookDemoActivity.this);												// 调用数据库进行备份												helper.backupData(privacy);												ProgressBar bar = (ProgressBar) backup_view														.findViewById(R.id.pb_backup);												Button btn_backup_ok = (Button) backup_view														.findViewById(R.id.btn_backuup_ok);												bar.setMax(list.size());												for (int i = 0; i <= list														.size(); i++) {													bar.setProgress(i);												}												// 进度对话框提示一下												progressDialog														.setTitle("备份完成!一共 "																+ list.size()																+ " 条记录");												btn_backup_ok														.setVisibility(View.VISIBLE);												// ok按钮 的监听事件												btn_backup_ok														.setOnClickListener(new OnClickListener() {															@Override															public void onClick(																	View v) {																progressDialog																		.dismiss();																mainMenuDialog																		.dismiss();															}														});											}										}).setNegativeButton("取消", null)								.create()								.show();						break;					}					case 3: {						// 还原数据的处理						LayoutInflater layoutInflater = LayoutInflater								.from(AddressPhoneBookDemoActivity.this);						View enterFileNameView = layoutInflater.inflate(								R.layout.enterfilename, null);						// 还原备份的对话框						enterFileNameDialog = new AlertDialog.Builder(								AddressPhoneBookDemoActivity.this).setView(								enterFileNameView)								.setNegativeButton("取消", null)								.setPositiveButton("确定",										new DialogInterface.OnClickListener() {											public void onClick(													DialogInterface dialog,													int which) {												DBHelper helper = new DBHelper(														AddressPhoneBookDemoActivity.this);												// 得到备份数据的文件夹												fileName = et_enter_file_name														.getText().toString();												if (helper.findFile(fileName)) {													new AlertDialog.Builder(															AddressPhoneBookDemoActivity.this)															.setTitle("请选择方式")															.setPositiveButton(																	"覆盖",																	// 覆盖数据的方法处理																	new DialogInterface.OnClickListener() {																		public void onClick(																				DialogInterface dialog,																				int which) {																			DBHelper helper = new DBHelper(																					AddressPhoneBookDemoActivity.this);																			// 删除所有联系人																			helper																					.deleteAll(0);																			// 恢复备份的联系人方法																			helper																					.restoreData(fileName);																			// 显示所有联系人的方法																			list = helper																					.getAllUser(privacy);																			adapter = new SimpleAdapter(																					AddressPhoneBookDemoActivity.this,																					list,																					R.layout.listitem,																					new String[] {																							"imageid",																							"name",																							"mobilephone" },																					new int[] {																							R.id.user_image,																							R.id.tv_name,																							R.id.tv_mobilephone });																			LayoutInflater li = LayoutInflater																					.from(AddressPhoneBookDemoActivity.this);																			View backup_view = li																					.inflate(																							R.layout.backup_progress,																							null);																			// 创建备份还原的数据对话框																			progressDialog = new AlertDialog.Builder(																					AddressPhoneBookDemoActivity.this)																					.setTitle(																							"正在还原数据...")																					.setView(																							backup_view)																					.create();																			progressDialog																					.show();																			ProgressBar bar = (ProgressBar) backup_view																					.findViewById(R.id.pb_backup);																			Button btn_backup_ok = (Button) backup_view																					.findViewById(R.id.btn_backuup_ok);																			bar																					.setMax(list																							.size());																			for (int i = 0; i <= list																					.size(); i++) {																				bar																						.setProgress(i);																			}																			progressDialog																					.setTitle("还原完成!一共还原了 "																							+ list																									.size()																							+ " 条记录");																			btn_backup_ok																					.setVisibility(View.VISIBLE);																			btn_backup_ok																					.setOnClickListener(new OnClickListener() {																						@Override																						public void onClick(																								View v) {																							progressDialog																									.dismiss();																							mainMenuDialog																									.dismiss();																							if (list																									.size() != 0) {																								mainLinearLayout																										.setBackgroundDrawable(null);																							}																							lv																									.setAdapter(adapter);																						}																					});																		}																	})															// 添加按钮的监听事件															.setNegativeButton(																	"添加",																	new DialogInterface.OnClickListener() {																		@Override																		public void onClick(																				DialogInterface dialog,																				int which) {																			DBHelper helper = new DBHelper(																					AddressPhoneBookDemoActivity.this);																			int preNum = list																					.size();																			helper																					.restoreData(fileName);																			list = helper																					.getAllUser(privacy);																			adapter = new SimpleAdapter(																					AddressPhoneBookDemoActivity.this,																					list,																					R.layout.listitem,																					new String[] {																							"imageid",																							"name",																							"mobilephone" },																					new int[] {																							R.id.user_image,																							R.id.tv_name,																							R.id.tv_mobilephone });																			LayoutInflater li = LayoutInflater																					.from(AddressPhoneBookDemoActivity.this);																			View backup_view = li																					.inflate(																							R.layout.backup_progress,																							null);																			progressDialog = new AlertDialog.Builder(																					AddressPhoneBookDemoActivity.this)																					.setTitle(																							"正在还原数据...")																					.setView(																							backup_view)																					.create();																			progressDialog																					.show();																			ProgressBar bar = (ProgressBar) backup_view																					.findViewById(R.id.pb_backup);																			Button btn_backup_ok = (Button) backup_view																					.findViewById(R.id.btn_backuup_ok);																			bar																					.setMax(list																							.size());																			for (int i = 0; i <= list																					.size(); i++) {																				bar																						.setProgress(i);																			}																			progressDialog																					.setTitle("还原完成!一共还原了 "																							+ (list																									.size() - preNum)																							+ " 条记录");																			btn_backup_ok																					.setVisibility(View.VISIBLE);																			btn_backup_ok																					.setOnClickListener(new OnClickListener() {																						@Override																						public void onClick(																								View v) {																							progressDialog																									.dismiss();																							mainMenuDialog																									.dismiss();																							lv																									.setAdapter(adapter);																						}																					});																		}																	})															// 取消按钮是监听事件															.setNeutralButton(																	"取消",																	new DialogInterface.OnClickListener() {																		@Override																		public void onClick(																				DialogInterface dialog,																				int which) {																		}																	}).create()															.show();												} else {													// 如果文件夹找不到提示一下													Toast															.makeText(																	enterFileNameDialog																			.getContext(),																	"找不到备份文件",																	Toast.LENGTH_LONG)															.show();												}											}										}).create();						et_enter_file_name = (EditText) enterFileNameView								.findViewById(R.id.et_enter_file_name);						et_enter_file_name.setText("comm_data");						et_enter_file_name.requestFocus();						et_enter_file_name.selectAll();						enterFileNameDialog.show();						adapter = new SimpleAdapter(								AddressPhoneBookDemoActivity.this, list,								R.layout.listitem, new String[] { "imageid",										"name", "mobilephone" }, new int[] {										R.id.user_image, R.id.tv_name,										R.id.tv_mobilephone });						lv.setAdapter(adapter);						// 显示所有数据						mainMenuDialog.dismiss();						break;					}					}				}			});		}	}	/*****	 * 查找联系人数据的处理函数	 * 	 * *	 **/	private void loadSearchLinearout() {		if (searchLinearout == null) {			// 实力化组件			searchLinearout = (LinearLayout) findViewById(R.id.ll_search);			et_search = (EditText) findViewById(R.id.et_search);			// 查找的编辑框设置监听事件			et_search.setOnKeyListener(new OnKeyListener() {				public boolean onKey(View arg0, int arg1, KeyEvent arg2) {					// 声明一个查找的内容					String condition = et_search.getText().toString();					if (condition.equals("")) {						lv.setAdapter(adapter);					}					DBHelper helper = new DBHelper(							AddressPhoneBookDemoActivity.this);					// DBHelper 中的getUsers 函数实现查找功能					list = helper.getUsers(condition, privacy);					// 为自己查找的数据设置一个新的适配器					SimpleAdapter searchAdapter = new SimpleAdapter(							AddressPhoneBookDemoActivity.this, list,							R.layout.listitem, new String[] { "imageid",									"name", "mobilephone" }, new int[] {									R.id.user_image, R.id.tv_name,									R.id.tv_mobilephone });					// 将整合好的adapter交给listview,显示给用户看					lv.setAdapter(searchAdapter);					if (list.size() == 0) {						// 如果没有联系人的时候设置背景为没有数据的图片						Drawable nodata_bg = getResources().getDrawable(								R.drawable.nodata_bg);						mainLinearLayout.setBackgroundDrawable(nodata_bg);						setTitle("没有查到任何数据");					} else {						setTitle("共查到 " + list.size() + " 条记录");						// /如果查到后设置背景颜色为空						mainLinearLayout.setBackgroundDrawable(null);					}					return false;				}			});		}	}	/*******	 * 一个简单的适配器映射到视图中定义的静态数据的XML文件 。您可以指定数据支持列表作为一个ArrayList的地图。	 * ArrayList中的每个条目对应于一个排在列表中。 这个地图包含为每一行的数据。您还可以指定一个XML文件,	 * 该文件定义视图用于显示的行,和一个映射键映射到特定的视图。 数据绑定到视图出现在两个阶段	 * 	 * *	 **/	private SimpleAdapter getMenuAdapter(String[] menuNameArray,			int[] imageResourceArray) {		ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();		for (int i = 0; i < menuNameArray.length; i++) {			HashMap<String, Object> map = new HashMap<String, Object>();			map.put("itemImage", imageResourceArray[i]);			map.put("itemText", menuNameArray[i]);			data.add(map);		}		SimpleAdapter simperAdapter = new SimpleAdapter(this, data,				R.layout.item_menu, new String[] { "itemImage", "itemText" },				new int[] { R.id.item_image, R.id.item_text });		return simperAdapter;	}	/*******	 * 当退出的时候,回收资源	 * 	 ****/	protected void onDestroy() {		if (confirmDialog != null) {			confirmDialog = null;		}		if (mainMenuDialog != null) {			mainMenuDialog = null;		}		if (searchLinearout != null) {			searchLinearout = null;		}		if (mainMenuView != null) {			mainMenuView = null;		}		if (mainMenuGrid != null) {			mainMenuGrid = null;		}		if (bottomMenuGrid != null) {			bottomMenuGrid = null;		}		if (adapter != null) {			adapter = null;		}		if (list != null) {			list = null;		}		if (lv != null) {			lv = null;		}		if (DBHelper.dbInstance != null) {			DBHelper.dbInstance.close();			DBHelper.dbInstance = null;		}		System.out.println("destory!!!");		super.onDestroy();	}}

13.接着是添加联系人的活动界面AddNewContacts.java

package com.wang.Activity;import com.wang.Db.DBHelper;import com.wang.UserInfo.UserInfo;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.view.animation.AnimationUtils;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.Gallery;import android.widget.ImageButton;import android.widget.ImageSwitcher;import android.widget.ImageView;import android.widget.Toast;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ImageView.ScaleType;import android.widget.ViewSwitcher.ViewFactory;public class AddNewContacts extends Activity implements ViewFactory {	EditText et_name;	EditText et_mobilePhone;	EditText et_officePhone;	EditText et_familyPhone;	EditText et_position;	EditText et_company;	EditText et_address;	EditText et_zipCode;	EditText et_otherContact;	EditText et_email;	EditText et_remark;	Button btn_save;	Button btn_return;	int privacy;	// 头像按钮	ImageButton imageButton;	// 图像选择的视图	View imageChooseView;	// 头像选择对话框	AlertDialog imageChooseDialog;	// 头像的Gallery	Gallery gallery;	// 头像的ImageSwitcher	ImageSwitcher is;	// 用于记录当前选中图像在图像数组中的位置	int currentImagePosition;	// 用于记录上一次图片的位置	int previousImagePosition;	// 判断头像有没有变化	boolean imageChanged;	/******	 * 所有的图像图片	 * 	 ****/	private int[] images = new int[] { R.drawable.icon, R.drawable.image1,			R.drawable.image2, R.drawable.image3, R.drawable.image4,			R.drawable.image5, R.drawable.image6, R.drawable.image7,			R.drawable.image8, R.drawable.image9, R.drawable.image10 };	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.addnewcontacts);		Intent intent = getIntent();		// 先确定好保密类型		if (intent.getExtras() != null				&& intent.getExtras().getInt("privacy") == 1) {			privacy = 1;		} else {			privacy = 0;		}		// 实例化组件		et_name = (EditText) findViewById(R.id.username);		et_mobilePhone = (EditText) findViewById(R.id.mobilephone);		et_officePhone = (EditText) findViewById(R.id.officephone);		et_familyPhone = (EditText) findViewById(R.id.familyphone);		et_position = (EditText) findViewById(R.id.position);		et_company = (EditText) findViewById(R.id.company);		et_address = (EditText) findViewById(R.id.address);		et_zipCode = (EditText) findViewById(R.id.zipcode);		et_otherContact = (EditText) findViewById(R.id.othercontact);		et_email = (EditText) findViewById(R.id.email);		et_remark = (EditText) findViewById(R.id.remark);		btn_save = (Button) findViewById(R.id.save);		btn_return = (Button) findViewById(R.id.btn_return);		imageButton = (ImageButton) findViewById(R.id.image_button);		/*****		 * 保存按钮的监听事件		 */		btn_save.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				// 判断姓名是否为空				String name = et_name.getText().toString();				if (name.trim().equals("")) {					Toast.makeText(AddNewContacts.this, "姓名不许为空",							Toast.LENGTH_LONG).show();					return;				}				// 从表单上获取数据				UserInfo user = new UserInfo();				user.username = name;				user.address = et_address.getText().toString();				user.company = et_company.getText().toString();				user.email = et_email.getText().toString();				user.familyPhone = et_familyPhone.getText().toString();				user.mobilePhone = et_mobilePhone.getText().toString();				user.officePhone = et_officePhone.getText().toString();				user.otherContact = et_otherContact.getText().toString();				user.position = et_position.getText().toString();				user.remark = et_remark.getText().toString();				user.zipCode = et_zipCode.getText().toString();				// 判断头像是否改变,若改变,则用当前的位置,若没有改变,则用前一回的位置				if (imageChanged) {					user.imageId = images[currentImagePosition % images.length];				} else {					user.imageId = images[previousImagePosition % images.length];				}				user.privacy = privacy;				// 创建数据库帮助类				DBHelper helper = new DBHelper(AddNewContacts.this);				// 打开数据库				helper.openDatabase();				// 把user存储到数据库里				long result = helper.insert(user);				// 通过结果来判断是否插入成功,若为1,则表示插入数据失败				if (result == -1) {					Toast.makeText(AddNewContacts.this, "添加失败",							Toast.LENGTH_LONG);				}				setTitle("用户添加成功!");				// 返回到上一个Activity,也就是Main.activity				setResult(3);				// 销毁当前视图				finish();			}		});		/**		 * 		 * f返回按钮的监听事件		 * **/		btn_return.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				finish();			}		});		/***		 * 图片按钮 的监听事件		 * 		 * **/		imageButton.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				// 为gallery装载图片 调用下面的loadImage的方法				loadImage();				// 初始化imageChooseDialog				initImageChooseDialog();				imageChooseDialog.show();			}		});	}	/*****	 * 图片按钮的装载方法实现选择图片的功能	 * 	 * **/	public void loadImage() {		if (imageChooseView == null) {			LayoutInflater li = LayoutInflater.from(AddNewContacts.this);			imageChooseView = li.inflate(R.layout.imageswitch, null);			// 通过渲染xml文件,得到一个视图(View),再拿到这个View里面的Gallery			gallery = (Gallery) imageChooseView.findViewById(R.id.gallery);			// 为Gallery装载图片			gallery.setAdapter(new ImageAdapter(this));			// 设置选择的位置为图片的中间位置			gallery.setSelection(images.length / 2);			is = (ImageSwitcher) imageChooseView.findViewById(R.id.imageswitch);			is.setFactory(this);			// 设置动画效果淡入淡出			is.setInAnimation(AnimationUtils.loadAnimation(this,					android.R.anim.fade_in));			// 卸载图片的动画效果			is.setOutAnimation(AnimationUtils.loadAnimation(this,					android.R.anim.fade_out));			// 为画廊图片设置监听事件			gallery.setOnItemSelectedListener(new OnItemSelectedListener() {				@Override				public void onItemSelected(AdapterView<?> arg0, View arg1,						int arg2, long arg3) {					// 当前的头像位置为选中的位置					currentImagePosition = arg2;					// 为ImageSwitcher设置图像					is.setImageResource(images[arg2 % images.length]);				}				@Override				public void onNothingSelected(AdapterView<?> arg0) {				}			});		}	}	/**	 * 自定义Gallery的适配器	 * 	 ***/	class ImageAdapter extends BaseAdapter {		private Context context;		public ImageAdapter(Context context) {			this.context = context;		}		@Override		public int getCount() {			return Integer.MAX_VALUE;		}		@Override		public Object getItem(int position) {			return position;		}		@Override		public long getItemId(int position) {			return position;		}		/**		 * gallery从这个方法中拿到image		 */		@Override		public View getView(int position, View convertView, ViewGroup parent) {			ImageView iv = new ImageView(context);			iv.setImageResource(images[position % images.length]);			iv.setAdjustViewBounds(true);			iv.setLayoutParams(new Gallery.LayoutParams(80, 80));			iv.setPadding(15, 10, 15, 10);			return iv;		}	}	@Override	public View makeView() {		ImageView view = new ImageView(this);		view.setBackgroundColor(0xff000000);		// 控制图像应调整大小和移动以匹配这个ImageView的大小 居中		view.setScaleType(ScaleType.FIT_CENTER);		// 设置图片的大小为 90 * 90		view.setLayoutParams(new ImageSwitcher.LayoutParams(90, 90));		return view;	}	public void initImageChooseDialog() {		if (imageChooseDialog == null) {			// 选择图片的对话框			AlertDialog.Builder builder = new AlertDialog.Builder(this);			builder.setTitle("请选择图像")			.setView(imageChooseView).setPositiveButton("确定",					new DialogInterface.OnClickListener() {						// 确定按钮的监听事件						public void onClick(DialogInterface dialog, int which) {							imageChanged = true;							previousImagePosition = currentImagePosition;							// 设置图片为选择图片的通过位置							imageButton									.setImageResource(images[currentImagePosition											% images.length]);						}					}).setNegativeButton("取消",					new DialogInterface.OnClickListener() {						// 取消按钮的监听事件						@Override						public void onClick(DialogInterface dialog, int which) {							currentImagePosition = previousImagePosition;						}					});			imageChooseDialog = builder.create();		}	}	/**	 * 当退出的时候,回收资源	 */	@Override	protected void onDestroy() {		if (is != null) {			is = null;		}		if (gallery != null) {			gallery = null;		}		if (imageChooseDialog != null) {			imageChooseDialog = null;		}		if (imageChooseView != null) {			imageChooseView = null;		}		if (imageButton != null) {			imageButton = null;		}		super.onDestroy();	}}


14.接着是后台数据库的支持类DBHelper.java

package com.wang.Db;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import com.wang.UserInfo.UserInfo;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.os.Environment;public class DBHelper {	public static final String DB_DBNAME = "Addressphone";	public static final String DB_TABLENAME = "addressphone";	public static final int VERSION = 4;	public static SQLiteDatabase dbInstance;	private MyDBHelper myDBHelper;	private StringBuffer tableCreate;	private Context context;	public DBHelper(Context context) {		this.context = context;	}	// 打开数据库	public void openDatabase() {		if (dbInstance == null) {			myDBHelper = new MyDBHelper(context, DB_DBNAME, VERSION);			dbInstance = myDBHelper.getWritableDatabase();		}	}	/**	 * 往数据库里面的user表插入一条数据,若失败返回-1	 */	public long insert(UserInfo user) {		ContentValues values = new ContentValues();		values.put("name", user.username);		values.put("mobilephone", user.mobilePhone);		values.put("officephone", user.officePhone);		values.put("familyphone", user.familyPhone);		values.put("address", user.address);		values.put("othercontact", user.otherContact);		values.put("email", user.email);		values.put("position", user.position);		values.put("company", user.company);		values.put("zipcode", user.zipCode);		values.put("remark", user.remark);		values.put("imageid", user.imageId);		values.put("privacy", user.privacy);		return dbInstance.insert(DB_TABLENAME, null, values);	}	/**	 * 获得数据库中所有的用户,将每一个用户放到一个map中去,然后再将map放到list里面去返回	 */	public ArrayList getAllUser(boolean privacy) {		ArrayList list = new ArrayList();		Cursor cursor = null;		if (privacy) {			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",					"name", "mobilephone", "officephone", "familyphone",					"address", "othercontact", "email", "position", "company",					"zipcode", "remark", "imageid" },			"privacy=1", null, null, null, null);		} else {			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",					"name", "mobilephone", "officephone", "familyphone",					"address", "othercontact", "email", "position", "company",					"zipcode", "remark", "imageid" }, "privacy=0", null, null,					null, null);		}		while (cursor.moveToNext()) {			HashMap item = new HashMap();			item.put("_id", cursor.getInt(cursor.getColumnIndex("_id")));			item.put("name", cursor.getString(cursor.getColumnIndex("name")));			item.put("mobilephone", cursor.getString(cursor					.getColumnIndex("mobilephone")));			item.put("officephone", cursor.getString(cursor					.getColumnIndex("officephone")));			item.put("familyphone", cursor.getString(cursor					.getColumnIndex("familyphone")));			item.put("address", cursor.getString(cursor					.getColumnIndex("address")));			item.put("othercontact", cursor.getString(cursor					.getColumnIndex("othercontact")));			item.put("email", cursor.getString(cursor.getColumnIndex("email")));			item.put("position", cursor.getString(cursor					.getColumnIndex("position")));			item.put("company", cursor.getString(cursor					.getColumnIndex("company")));			item.put("zipcode", cursor.getString(cursor					.getColumnIndex("zipcode")));			item.put("remark", cursor					.getString(cursor.getColumnIndex("remark")));			item					.put("imageid", cursor.getInt(cursor							.getColumnIndex("imageid")));			list.add(item);		}		return list;	}	/**	 * 删除数据库表中的某条信息	 * **/	public void delete(int _id) {		dbInstance.delete(DB_TABLENAME, "_id=?", new String[] { String				.valueOf(_id) });	}	/**	 * 删除数据库表中的所有信息	 * **/	public void deleteAll(int privacy) {		dbInstance.delete(DB_TABLENAME, "privacy=?", new String[] { String				.valueOf(privacy) });	}	/**	 * 得到数据库表中的总的条目数	 * **/	public int getTotalCount() {		Cursor cursor = dbInstance.query(DB_TABLENAME,				new String[] { "count(*)" }, null, null, null, null, null);		cursor.moveToNext();		return cursor.getInt(0);	}	/**	 * 得到联系人的信息	 * **/	//	public ArrayList getUsers(String condition, boolean privacy) {		ArrayList list = new ArrayList();		String strSelection = "";		if (privacy) {			strSelection = "and privacy = 1";		} else {			strSelection = "and privacy = 0";		}		// 模糊查询		String sql = "select * from " + DB_TABLENAME				+ " where 1=1 and (name like '%" + condition + "%' "				+ "or mobilephone like '%" + condition				+ "%' or familyphone like '%" + condition + "%' "				+ "or officephone like '%" + condition + "%')" + strSelection;		Cursor cursor = dbInstance.rawQuery(sql, null);		while (cursor.moveToNext()) {			HashMap item = new HashMap();			item.put("_id", cursor.getInt(cursor.getColumnIndex("_id")));			item.put("name", cursor.getString(cursor.getColumnIndex("name")));			item.put("mobilephone", cursor.getString(cursor					.getColumnIndex("mobilephone")));			item.put("officephone", cursor.getString(cursor					.getColumnIndex("officephone")));			item.put("familyphone", cursor.getString(cursor					.getColumnIndex("familyphone")));			item.put("address", cursor.getString(cursor					.getColumnIndex("address")));			item.put("othercontact", cursor.getString(cursor					.getColumnIndex("othercontact")));			item.put("email", cursor.getString(cursor.getColumnIndex("email")));			item.put("position", cursor.getString(cursor					.getColumnIndex("position")));			item.put("company", cursor.getString(cursor					.getColumnIndex("company")));			item.put("zipcode", cursor.getString(cursor					.getColumnIndex("zipcode")));			item.put("remark", cursor					.getString(cursor.getColumnIndex("remark")));			item					.put("imageid", cursor.getInt(cursor							.getColumnIndex("imageid")));			list.add(item);		}		return list;	}	/**	 * 删除标记	 * **/	public void deleteMarked(ArrayList<Integer> deleteId) {		StringBuffer strDeleteId = new StringBuffer();		strDeleteId.append("_id=");		for (int i = 0; i < deleteId.size(); i++) {			if (i != deleteId.size() - 1) {				strDeleteId.append(deleteId.get(i) + " or _id=");			} else {				strDeleteId.append(deleteId.get(i));			}		}		dbInstance.delete(DB_TABLENAME, strDeleteId.toString(), null);		System.out.println(strDeleteId.toString());	}	/**	 * 备份数据	 * **/	//	public void backupData(boolean privacy) {		StringBuffer sqlBackup = new StringBuffer();		Cursor cursor = null;		if (privacy) {			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",					"name", "mobilephone", "officephone", "familyphone",					"address", "othercontact", "email", "position", "company",					"zipcode", "remark", "imageid,privacy" }, "privacy=1",					null, null, null, null);		} else {			cursor = dbInstance.query(DB_TABLENAME, new String[] { "_id",					"name", "mobilephone", "officephone", "familyphone",					"address", "othercontact", "email", "position", "company",					"zipcode", "remark", "imageid,privacy" }, "privacy=0",					null, null, null, null);		}		while (cursor.moveToNext()) {			sqlBackup					.append(							"insert into "									+ DB_TABLENAME									+ "(name,mobilephone,officephone,familyphone,address,othercontact,email,position,company,zipcode,remark,imageid,privacy)")					.append(" values ('")					.append(cursor.getString(cursor.getColumnIndex("name")))					.append("','")					.append(							cursor.getString(cursor									.getColumnIndex("mobilephone")))					.append("','")					.append(							cursor.getString(cursor									.getColumnIndex("officephone")))					.append("','")					.append(							cursor.getString(cursor									.getColumnIndex("familyphone")))					.append("','")					.append(cursor.getString(cursor.getColumnIndex("address")))					.append("','")					.append(							cursor.getString(cursor									.getColumnIndex("othercontact")))					.append("','")					.append(cursor.getString(cursor.getColumnIndex("email")))					.append("','")					.append(cursor.getString(cursor.getColumnIndex("position")))					.append("','").append(							cursor.getString(cursor.getColumnIndex("company")))					.append("','").append(							cursor.getString(cursor.getColumnIndex("zipcode")))					.append("','").append(							cursor.getString(cursor.getColumnIndex("remark")))					.append("',").append(							cursor.getInt(cursor.getColumnIndex("imageid")))					.append(",").append(							cursor.getInt(cursor.getColumnIndex("privacy")))					.append(");").append("\n");		}		saveDataToFile(sqlBackup.toString(), privacy);	}	/**	 * 保存数据到文件中	 * **/	private void saveDataToFile(String strData, boolean privacy) {		String fileName = "";		if (privacy) {			fileName = "priv_data.bk";		} else {			fileName = "comm_data.bk";		}		try {			String SDPATH = Environment.getExternalStorageDirectory() + "/";			File fileParentPath = new File(SDPATH + "zpContactData/");			fileParentPath.mkdirs();			File file = new File(SDPATH + "zpContactData/" + fileName);			System.out.println("the file previous path = "					+ file.getAbsolutePath());			file.createNewFile();			System.out					.println("the file next path = " + file.getAbsolutePath());			FileOutputStream fos = new FileOutputStream(file);			fos.write(strData.getBytes());			fos.flush();		} catch (IOException e) {			e.printStackTrace();		}	}	/**	 * 恢复备份数据方法	 * **/	//	public void restoreData(String fileName) {		try {			String SDPATH = Environment.getExternalStorageDirectory() + "/";			File file = null;			if (fileName.endsWith(".bk")) {				file = new File(SDPATH + "zpContactData/" + fileName);			} else {				file = new File(SDPATH + "zpContactData/" + fileName + ".bk");			}			BufferedReader br = new BufferedReader(new FileReader(file));			String str = "";			while ((str = br.readLine()) != null) {				System.out.println(str);				dbInstance.execSQL(str);			}		} catch (Exception e) {			e.printStackTrace();		}	}	/**	 * 查找备份的文件	 * **/	public boolean findFile(String fileName) {		String SDPATH = Environment.getExternalStorageDirectory() + "/";		File file = null;		if (fileName.endsWith(".bk")) {			file = new File(SDPATH + "zpContact/" + fileName);		} else {			file = new File(SDPATH + "zpContact/" + fileName + ".bk");		}		if (file.exists()) {			return true;		} else {			return false;		}	}	/**	 * 创建一个打开数据库的方法	 * **/	class MyDBHelper extends SQLiteOpenHelper {		public MyDBHelper(Context context, String name, int version) {			super(context, name, null, version);		}		// 创建数据库		public void onCreate(SQLiteDatabase db) {			tableCreate = new StringBuffer();			// 创建表			tableCreate.append("create table ").append(DB_TABLENAME).append(					" (").append("_id integer primary key autoincrement,")					.append("name text,").append("mobilephone text,").append(							"officephone text,").append("familyphone text,")					.append("address text,").append("othercontact text,")					.append("email text,").append("position text,").append(							"company text,").append("zipcode text,").append(							"remark text,").append("imageid int,").append(							"privacy int ").append(")");			System.out.println(tableCreate.toString());			// 执行创建语句			db.execSQL(tableCreate.toString());		}		// 数据库时需要升级删除表,在重新创建		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {			String sql = "drop table if exists " + DB_TABLENAME;			db.execSQL(sql);			myDBHelper.onCreate(db);		}	}}

15.然后呢,就是用户信息的类UserInfo.java

package com.wang.UserInfo;import java.io.Serializable;public class UserInfo implements Serializable{		public int _id;		public String username;		public String mobilePhone;		public String officePhone;		public String familyPhone;		public String position;		public String company;		public String address;		public String zipCode;		public String email;		public String otherContact;		public String remark;		public int imageId;		public int privacy;//1代表隐私用户  0代表普通用户					}

16.亲,最后别忘了添加权限和注册Activity哦!!

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.wang.Activity"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="10" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name" >        <activity            android:name=".startAnimation"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".AddressPhoneBookDemoActivity" />        <activity android:name=".AddNewContacts" />    </application>    <uses-permission android:name="android.permission.CALL_PHONE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></manifest>
17.然后就可以看到运行结果喽!!运行结果如下:

 解释一下,第一张的欢迎界面,                                           第二张是跳转的的主界面                                                        第三张的点击item拨打联系人电话的界面

                     第四张的增加联系人的界面                               第五张的选择联系人头像的界面                                            第六张是查找联系人的界面

                      第七张是删除一条已标记的联系人的界面      第八张是管理联系人的界面                                                    第九张的删除所有联系人的界面

                      第十张是调用系统拨号功能的界面                   第十一张是备份数据的界面                                                   第十二章是备份完成的界面









  相关解决方案