android自定义View之Android手机通讯录制作

合集下载

Android开发实验---通讯录

Android开发实验---通讯录

实验报告通讯录姓名:学号:课程名称:移动应用开发所在学院:信息科学与工程学院专业班级:计算机任课教师:主要功能分析:1、增加、删除、编联系人点击通信录界面中的增加按钮,入增加联系人面。

输入联系人的基本信息,并可根据用户需求增加个性化信息如头像、姓名、手机号码、办室电话、家庭电话、职务职称、单位名称、地址、邮政编码、Email、其他联系方式、备注这些信息,击确认返回主界面。

点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改系人的资料或进行删除联系人操作,完成后退回到主界面。

对列表中联系人的标记,点mnu键弹出功能界面上的删除按键也可进行删除。

还可以在菜单上选择删除全部联系人清空通讯录。

在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则系人信息将继续保存。

2、查找联系人用户点击menu键打开底部菜单框,底部菜单框为查询系人提供入口,进入通讯录的缺省页面为联系人列表,在列表中看到所有联系人的姓名、电话息排列,用户点击查找按键输入联系人基本信息,,通讯录显所有符合查询条件的联系人列表,用户选择一个联系人进入联系人基本信息页面进行其他操作;查询完成,用户按返回键返回主界面。

3、通功能用户在通录选择联系人进入联系详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息的功能进行操作。

4、菜单能通过对menu按的点击,显示底部菜框,包含有增加查找、除、菜单、返回功能,菜单按键则包含显示所有、删除所有等实用功能。

增加联系人:这个功能由ContactAdder类完成,具体实现不是比较麻烦,保存动作由ContentResolver类解决,但实现方式有所不同,可分为一次性批量增加与挨个增加。

由于界面设置繁琐,代码页过多,所以挑出其中的一部分进行说明首先是DB数据库建库过程:package com.xample.hivian.my_contact_manager.models.db;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteOpenHelper;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import com.example.hivian.my_contact_manager.models.Contact;import com.example.hivian.my_contact_manager.models.Sms;import java.util.ArrayList;import java.util.List;public class DBHandler extends SQLiteOpenHelper {// Database Versionprivate static final int DB_VERSION = 1;// Database Nameprivate static final String DB_NAME = "DB";// Contacts table nameprivate static final String CONTACTS_TABLE = "contacts";//通讯录private static final String SMS_TABLE = "sms";// Shops Table Columns names private static final String KEY_ID = "id";private static final String KEY_IMAGE = "image";//图片private static final String KEY_NAME = "name";//姓名private static final String KEY_PHONE = "phone";//电话号码private static final String KEY_EMAIL = "email";//邮箱private static final String KEY_ADDRESS = "address";//联系人地址private static final String KEY_SMS_HEADER = "sms_header";private static final String KEY_SMS_CONTENT = "sms_content";private static final String KEY_CONTACT_ID = "contact_id";private static final String KEY_SMS_TYPE = "sms_type";private static final String CONTACTS_TABLE_CREATE ="CREATE TABLE " + CONTACTS_TABLE + " (" + KEY_ID + " INTEGER PRIMARY KEY, " + KEY_IMAGE + " BLOB, " + KEY_NAME + " TEXT, " + KEY_PHONE + " TEXT, " +KEY_EMAIL + " TEXT, " + KEY_ADDRESS + " TEXT)";private static final String SMS_TABLE_CREATE ="CREATE TABLE " + SMS_TABLE + " (" + KEY_ID + " INTEGER PRIMARY KEY, " +KEY_SMS_HEADER + " TEXT, " + KEY_SMS_CONTENT + " TEXT, " +KEY_CONTACT_ID + " INTEGER," + KEY_SMS_TYPE + " INTEGER)";private static DBHandler dbInstance= null;public static DBHandlergetInstance(Context context) {if (dbInstance== null) {dbInstance= new DBHandler(context, DB_NAME, DB_VERSION);}return dbInstance;}DBHandler(Context context, String dbName, int dbVersion) {super(context, dbName, null, dbVersion);}@Overridepublic void onCreate(SQLiteDatabasedb) {db.execSQL(CONTACTS_TABLE_CREATE);db.execSQL(SMS_TABLE_CREATE);}@Overridepublic void onUpgrade(SQLiteDatabasedb, int oldVersion, int newVersion) {// Drop older table if existeddb.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE);db.execSQL("DROP TABLE IF EXISTS " + SMS_TABLE);// 重新创建表onCreate(db);}//新增联系人public void addContact(Contact contact) {SQLiteDatabasedb = this.getWritableDatabase();ContentValues values = new ContentValues();values.put(KEY_IMAGE, contact.getImage());values.put(KEY_NAME, contact.getName());values.put(KEY_PHONE, contact.getPhone());values.put(KEY_EMAIL, contact.getEmail());values.put(KEY_ADDRESS, contact.getAddress());db.insert(CONTACTS_TABLE, null, values);}// Adding new smspublic void addSms(Smssms) {SQLiteDatabasedb = this.getWritableDatabase();ContentValues values = new ContentValues();values.put(KEY_SMS_HEADER, sms.getHeader());values.put(KEY_SMS_CONTENT, sms.getContent());values.put(KEY_CONTACT_ID, sms.getContactId());values.put(KEY_SMS_TYPE, sms.getType());db.insert(SMS_TABLE, null, values);}// Getting one contactpublic Contact getContact(int id) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(CONTACTS_TABLE, new String[]{ KEY_ID, KEY_IMAGE, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS }, KEY_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null);if (cursor != null)cursor.moveToFirst();Contact contact = new Contact(cursor.getBlob(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5));contact.setId(cursor.getInt(0));cursor.close();return contact;}// Getting one contact by namepublic Contact getContactByName(String name) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(CONTACTS_TABLE, new String[]{ KEY_ID, KEY_IMAGE, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS }, KEY_NAME + "=?", new String[] { name }, null, null, null, null);if (cursor != null)cursor.moveToFirst();Contact contact = new Contact(cursor.getBlob(1), cursor.getString(2),cursor.getString(3), cursor.getString(4), cursor.getString(5));contact.setId(cursor.getInt(0));cursor.close();return contact;}// Getting one contact by phonepublic Contact getContactByPhone(String phone) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(CONTACTS_TABLE, new String[]{ KEY_ID, KEY_IMAGE, KEY_NAME, KEY_PHONE, KEY_EMAIL, KEY_ADDRESS }, KEY_PHONE + "=?", new String[] { phone }, null, null, null, null);if (!cursor.moveToFirst())return null;Contact contact = new Contact(cursor.getBlob(1), cursor.getString(2),cursor.getString(3), cursor.getString(4), cursor.getString(5));contact.setId(cursor.getInt(0));cursor.close();return contact;}// Getting one sms by contact idpublic List<Sms>getSmsByContactId(Integer id) {SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.query(SMS_TABLE, new String[]{ KEY_ID, KEY_SMS_HEADER, KEY_SMS_CONTENT, KEY_CONTACT_ID,KEY_SMS_TYPE },KEY_CONTACT_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null);List<Sms>allSms = new ArrayList<>();if (cursor.moveToFirst()) {do {Smssms = new Sms();sms.setId(Integer.parseInt(cursor.getString(0)));sms.setHeader(cursor.getString(1));sms.setContent(cursor.getString(2));sms.setContactId(cursor.getInt(3));sms.setType(cursor.getInt(4));allSms.add(sms);} while (cursor.moveToNext());}cursor.close();return allSms;}// Getting all contactspublic List<Contact>getAllContacts() {String selectQuery = "SELECT * FROM " + CONTACTS_TABLE; SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(selectQuery, null);List<Contact>allContacts = new ArrayList<>();if (cursor.moveToFirst()) {do {Contact contact = new Contact();contact.setId(Integer.parseInt(cursor.getString(0)));contact.setImage(cursor.getBlob(1));contact.setName(cursor.getString(2));contact.setPhone(cursor.getString(3));contact.setEmail(cursor.getString(4));contact.setAddress(cursor.getString(5));allContacts.add(contact);} while (cursor.moveToNext());}cursor.close();return allContacts;}// Getting all smspublic List<Sms>getAllSms() {String selectQuery = "SELECT * FROM " + SMS_TABLE; SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(selectQuery, null);List<Sms>allSms = new ArrayList<>();if (cursor.moveToFirst()) {do {Smssms = new Sms();sms.setId(Integer.parseInt(cursor.getString(0)));sms.setHeader(cursor.getString(1));sms.setContent(cursor.getString(2));sms.setContactId(cursor.getInt(3));sms.setType(cursor.getInt(4));allSms.add(sms);} while (cursor.moveToNext());}cursor.close();return allSms;}// Getting all sms from contactpublic List<Sms>getAllSmsFromContact(int id) {String selectQuery = "SELECT * FROM " + SMS_TABLE + " WHERE " + KEY_CONTACT_ID + " = " + id;SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(selectQuery, null);List<Sms>allSms = new ArrayList<>();if (cursor.moveToFirst()) {do {Smssms = new Sms();sms.setId(Integer.parseInt(cursor.getString(0)));sms.setHeader(cursor.getString(1));sms.setContent(cursor.getString(2));sms.setContactId(cursor.getInt(3));sms.setType(cursor.getInt(4));allSms.add(sms);} while (cursor.moveToNext());}cursor.close();return allSms;}// Getting contacts countpublic Integer getContactsCount() {String countQuery = "SELECT * FROM " + CONTACTS_TABLE; SQLiteDatabasedb = this.getReadableDatabase();Cursor cursor = db.rawQuery(countQuery, null);return cursor.getCount();}// Checking duplicates in tablepublic boolean isDuplicate(DBHandlerdb, String name) {List<Contact> contacts = db.getAllContacts();for (Contact cont : contacts) {if (cont.getName().equals(name))return true;}return false;}// Updating a contactpublic Integer updateContact(Contact contact) {SQLiteDatabasedb = this.getWritableDatabase();ContentValues values = new ContentValues();values.put(KEY_IMAGE, contact.getImage());values.put(KEY_NAME, contact.getName());values.put(KEY_PHONE, contact.getPhone());values.put(KEY_EMAIL, contact.getEmail());values.put(KEY_ADDRESS, contact.getAddress());return db.update(CONTACTS_TABLE, values, KEY_ID + " = ?", new String[]{String.valueOf(contact.getId())});}// Updating a smspublic Integer updateSms(Smssms) {SQLiteDatabasedb = this.getWritableDatabase(); ContentValues values = new ContentValues();values.put(KEY_SMS_HEADER, sms.getHeader());values.put(KEY_SMS_CONTENT, sms.getContent());values.put(KEY_CONTACT_ID, sms.getContactId());values.put(KEY_SMS_TYPE, sms.getType());return db.update(SMS_TABLE, values, KEY_ID + " = ?",new String[]{String.valueOf(sms.getId())});}// Deleting a contactpublic void deleteContact(Contact contact) { SQLiteDatabasedb = this.getWritableDatabase();db.delete(CONTACTS_TABLE, KEY_ID + " = ?",new String[] { String.valueOf(contact.getId()) });}// Deleting a contactpublic void deleteSms(Smssms) {SQLiteDatabasedb = this.getWritableDatabase();db.delete(SMS_TABLE, KEY_ID + " = ?",new String[] { String.valueOf(sms.getId()) });}// Deleting all contactspublic void deleteAllContacts(DBHandlerdb) {List<Contact> contacts = db.getAllContacts();for (Contact cont : contacts) {db.deleteContact(cont);}}// Deleting all smspublic void deleteAllSms(DBHandlerdb) {List<Sms>allSms = db.getAllSms();for (Smssms : allSms) {db.deleteSms(sms);}}}界面切换:package com.example.hivian.my_contact_manager.views.activities;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.WindowManager;import com.example.hivian.my_contact_manager.R;import java.util.Timer;import java.util.TimerTask;public class SplashActivity extends Activity {private static final long DELAY = 1000;private boolean scheduled = false;private Timer splashTimer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_splash);this.getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);splashTimer= new Timer();splashTimer.schedule(new TimerTask(){@Overridepublic void run(){Intent intent = new Intent(SplashActivity.this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);startActivity(intent);overridePendingTransition(0, 0);SplashActivity.this.finish();}}, DELAY);scheduled = true;}@Overrideprotected void onDestroy() {super.onDestroy();if (scheduled) {splashTimer.cancel();}splashTimer.purge();}}按钮设计:package com.example.hivian.my_contact_manager.views.fragments; import android.Manifest;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.graphics.Color;import android.graphics.Typeface;import .Uri;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.content.ContextCompat;import android.support.v4.content.res.ResourcesCompat;import android.support.v7.app.ActionBar;import android.support.v7.app.AppCompatActivity;import android.util.TypedValue;import youtInflater;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.ScrollView;import android.widget.TextView;import android.widget.Toast;import android.support.v4.app.Fragment;import com.example.hivian.my_contact_manager.R;import com.example.hivian.my_contact_manager.models.Contact;import com.example.hivian.my_contact_manager.models.Sms;import com.example.hivian.my_contact_manager.models.db.DBHandler;import com.example.hivian.my_contact_manager.utilities.BitmapUtility;import com.example.hivian.my_contact_manager.views.activities.ContactEditionActivity; import com.example.hivian.my_contact_manager.views.activities.ContactSmsActivity;import com.example.hivian.my_contact_manager.views.activities.MainActivity;import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;import java.util.List;public class ContactInfoFragment extends Fragment implements View.OnClickListener, View.OnTouchListener {private TextView name;private TextView phone;public FloatingActionMenu actionMenu;private DBHandler db;@Nullable@Overridepublic View onCreateView(LayoutInflaterinflater, @Nullable ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(yout.fragment_contact_info, container, false);setHasOptionsMenu(true);ActionBar ab = ((AppCompatActivity) getActivity()).getSupportActionBar();if (ab != null) {ab.setTitle("Options");ab.setDisplayHomeAsUpEnabled(true);}db= DBHandler.getInstance(getActivity());Contact receivedContact = (Contact) getArguments().getSerializable("contact");if (receivedContact != null) {ImageViewimageView = (ImageView) view.findViewById(_image);name = (TextView) view.findViewById(_name);phone = (TextView) view.findViewById(_phone);TextView email = (TextView) view.findViewById(_email);TextView address = (TextView) view.findViewById(_address);if (receivedContact.getImage() != null) {Bitmap imageBm = BitmapUtility.getImage(receivedContact.getImage());imageView.setImageBitmap(imageBm);}name.setText(receivedContact.getName());phone.setText(receivedContact.getPhone());if (receivedContact.getEmail().equals("")) {email.setTypeface(null, Typeface.ITALIC);email.setTextColor(Color.GRAY);email.setTextSize(PLEX_UNIT_DIP, 18f);email.setText(R.string.placeholder_none);}elseemail.setText(receivedContact.getEmail());if (receivedContact.getAddress().equals("")) {address.setTypeface(null, Typeface.ITALIC);address.setTextColor(Color.GRAY);address.setTextSize(PLEX_UNIT_DIP, 18f);address.setText(R.string.placeholder_none);}elseaddress.setText(receivedContact.getAddress());}return view;}@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) { initInfoMenu(view);ScrollViewscrollView = (ScrollView) view.findViewById(R.id.scrollview_contact_info); scrollView.setOnTouchListener(this);super.onViewCreated(view, savedInstanceState);}@Overridepublic boolean onTouch(View v, MotionEvent event) {actionMenu.close(true);return false;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.itemId1:toSmsManager();break;case R.id.itemId2:callContact();break;case R.id.itemId3:editContact();break;case R.id.itemId4:deleteContact();break;}actionMenu.close(true);}@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflaterinflater) {inflater.inflate(R.menu.menu_main, menu);super.onCreateOptionsMenu(menu,inflater);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:actionMenu.close(true);getFragmentManager().popBackStack();return true;default:return super.onOptionsItemSelected(item);}}private void initInfoMenu(View view) {ImageView menuIcon1 = new ImageView(getActivity());ImageView menuIcon2 = new ImageView(getActivity());ImageView menuIcon3 = new ImageView(getActivity());ImageView menuIcon4 = new ImageView(getActivity());menuIcon1.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_message_black_24dp, null));menuIcon2.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_call_black_24dp, null));menuIcon3.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_mode_edit_black_24dp, null));menuIcon4.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.ic_delete_black_24dp, null));menuIcon1.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.circle_opacity, null));menuIcon2.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.circle_opacity, null));menuIcon3.setBackground(ResourcesCompat.getDrawable(getResources(),R.drawable.circle_opacity, null));menuIcon4.setBackground(ResourcesCompat.getDrawable(getResources(),R.drawable.circle_opacity, null));menuIcon1.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon2.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon3.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon4.setColorFilter(ContextCompat.getColor(getActivity(), android.R.color.white));menuIcon1.setPadding(15,15,15,15);menuIcon2.setPadding(15,15,15,15);menuIcon3.setPadding(15,15,15,15); //设置的是各个控件之间的距离menuIcon4.setPadding(15,15,15,15);SubActionButton.BuilderitemBuilder = new SubActionButton.Builder(getActivity()); itemBuilder.setLayoutParams(new youtParams(160,160));ImageViewmenuInfo = (ImageView) view.findViewById(_menu);actionMenu= new FloatingActionMenu.Builder(getActivity()).addSubActionView(itemBuilder.setContentView(menuIcon1).build()) .addSubActionView(itemBuilder.setContentView(menuIcon2).build()) .addSubActionView(itemBuilder.setContentView(menuIcon3).build()) .addSubActionView(itemBuilder.setContentView(menuIcon4).build()) .attachTo(menuInfo).setStartAngle(100).setEndAngle(260).build();menuIcon1.setId(R.id.itemId1);menuIcon1.setOnClickListener(this);menuIcon2.setId(R.id.itemId2);menuIcon2.setOnClickListener(this);menuIcon3.setId(R.id.itemId3);menuIcon3.setOnClickListener(this);menuIcon4.setId(R.id.itemId4);menuIcon4.setOnClickListener(this);}private void toSmsManager() {name = (TextView) getActivity().findViewById(_name);phone = (TextView) getActivity().findViewById(_phone);Intent intent = new Intent(getActivity(), ContactSmsActivity.class);intent.putExtra("name", name.getText().toString());intent.putExtra("phone", phone.getText().toString());startActivity(intent);}private void callContact() {phone = (TextView) getActivity().findViewById(_phone);Intent callIntent = new Intent(Intent.ACTION_CALL);callIntent.setData(Uri.parse("tel:" + phone.getText().toString()));if (ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {startActivity(callIntent);} else {Toast toast = Toast.makeText(getActivity(), R.string.alert_no_call_perm, Toast.LENGTH_LONG);toast.show();}}private void editContact() {name = (TextView) getActivity().findViewById(_name);Contact contact = db.getContactByName(name.getText().toString());Intent intent = new Intent(getActivity(), ContactEditionActivity.class);intent.putExtra("contact", contact);startActivity(intent);}private void deleteContact() {AlertDialog dialog = new AlertDialog.Builder(getActivity()).setMessage(getResources().getString(R.string.alert_delete_message)).setCancelable(false).setPositiveButton(getResources().getString(R.string.alert_delete_ok),new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {TextViewtextView = (TextView) getActivity().findViewById(_name);Contact contact =db.getContactByName(textView.getText().toString());db.deleteContact(contact);List<Sms>allSms = db.getAllSmsFromContact(contact.getId());for (Smssms : allSms) {db.deleteSms(sms);}Intent intent = new Intent(getActivity(), MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);}}).setNegativeButton(getResources().getString(R.string.alert_delete_cancel), null).show();Button buttonPositive = dialog.getButton(DialogInterface.BUTTON_POSITIVE);Button buttonNegative = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);buttonPositive.setTextColor(ContextCompat.getColor(getActivity(),R.color.colorPrimary));buttonNegative.setTextColor(ContextCompat.getColor(getActivity(),R.color.colorPrimary));}}Main程序:package com.example.hivian.my_contact_manager.views.activities;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import com.example.hivian.my_contact_manager.R;import com.example.hivian.my_contact_manager.models.Contact;import com.example.hivian.my_contact_manager.utilities.Utility;import com.example.hivian.my_contact_manager.views.fragments.ContactInfoFragment;import com.example.hivian.my_contact_manager.views.fragments.ContactListFragment;public class MainActivity extends AppCompatActivity implementsContactListFragment.DataPassListener {private ContactListFragment fragmentA;private ContactInfoFragment fragmentB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main_activity);if (findViewById(R.id.fragment_holder) != null) {Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);if (savedInstanceState != null) {fragmentA= new ContactListFragment();fragmentB= new ContactInfoFragment();return;}fragmentA= new ContactListFragment();fragmentB= new ContactInfoFragment();getSupportFragmentManager().beginTransaction().add(R.id.fragment_holder, fragmentA).commit();Utility.changeStatusBarColor(this);}}@Overridepublic void onBackPressed() {int count = getSupportFragmentManager().getBackStackEntryCount();if (count == 0) {super.onBackPressed();} else {if (fragmentB.actionMenu!= null) {fragmentB.actionMenu.close(true);}getSupportFragmentManager().popBackStack();}}@Overridepublic void passData(Contact contact) {if (fragmentB!= null) {Bundle args = new Bundle();args.putSerializable("contact", contact);fragmentB.setArguments(args);getSupportFragmentManager().beginTransaction().setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right).replace(R.id.fragment_holder, fragmentB).addToBackStack(null)五、实验数据(现象)处理分析下面是程序的截图:软件界面以及各个自文件目录示意图:通讯录在Android手机功能界面上的显示图标以及图标在工程里存放的位置:进入通讯录时的初界面以及图标的配置过程:刚开始运行通讯录时,出现几个权限选择:开始界面(按加号):创建一个新的联系人:会弹出键盘创建联系人的过程中如果格式不规范会有错误提示:比如Email格式错误创建好后的界面(多创建几个联系人),头像可以更改:修改头像时出现的错误如下(照相机和相册里选择合适的头像):接下来进行对通讯录的基本功能测试。

Android自定义TextView实现文本内容自动调整字体大小

Android自定义TextView实现文本内容自动调整字体大小

Android⾃定义TextView实现⽂本内容⾃动调整字体⼤⼩最近做通讯录⼩屏机联系⼈姓名显⽰--长度超过边界字体变⼩/*** ⾃定义TextView,⽂本内容⾃动调整字体⼤⼩以适应TextView的⼤⼩* @author yzp*/public class AutoFitTextView extends TextView {private Paint mTextPaint;private float mTextSize;public AutoFitTextView(Context context) {super(context);}public AutoFitTextView(Context context, AttributeSet attrs) {super(context, attrs);}/*** Re size the font so the specified text fits in the text box assuming the* text box is the specified width.** @param text* @param textWidth*/private void refitText(String text, int textViewWidth) {if (text == null || textViewWidth <= 0)return;mTextPaint = new Paint();mTextPaint.set(this.getPaint());int availableTextViewWidth = getWidth() - getPaddingLeft() - getPaddingRight();float[] charsWidthArr = new float[text.length()];Rect boundsRect = new Rect();mTextPaint.getTextBounds(text, 0, text.length(), boundsRect);int textWidth = boundsRect.width();mTextSize = getTextSize();while (textWidth > availableTextViewWidth) {mTextSize -= 1;mTextPaint.setTextSize(mTextSize);textWidth = mTextPaint.getTextWidths(text, charsWidthArr);}this.setTextSize(PLEX_UNIT_PX, mTextSize);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);refitText(this.getText().toString(), this.getWidth());}}以上就是本⽂的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,同时也希望多多⽀持!。

Android手机通讯录(源码)

Android手机通讯录(源码)

Android⼿机通讯录(源码) 简易⼿机通讯录⼀:功能模块 1.主界⾯,通过listview 展⽰所有联系⼈信息,并在没有联系⼈时给出友好提⽰ 2.主界⾯.显⽰最近查看的某个联系⼈信息 3.主界⾯,可以长按某联系⼈项,弹出菜单,删除该联系⼈;删除联系⼈后,在⼿机通知栏弹出信息给⽤户提⽰ 4.主界⾯选择分组,可以查看所有联系⼈,也可以只查看某⼀分组的联系⼈ 5.点击主界⾯的某联系⼈,可以进⼊联系⼈详情界⾯,查看联系⼈各详细信息,并可修改联系⼈各信息; 联系⼈的性别和所在分组可通过下拉菜单选择;长按电话号码,可以进⼊拨打电话功能; 修改联系⼈信息后,跳转回到主界⾯,并使⽤Toast给予⽤户提⽰ 6.主界⾯菜单栏可以添加新联系⼈,关于等功能 7.能在联系⼈详情界⾯,动态增加多个联系电话,并储存到数据库中效果图展⽰:源码下载地址:项⽬回顾: 1.scrollview嵌套listview产⽣的滑动冲突(recyclerview) 解决⽅案:listView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_UP){//点击listview⾥⾯滚动停⽌时,scrollview拦截listview的触屏事件,就是scrollview该滚动了scrollView.requestDisallowInterceptTouchEvent(false);}else{//当listview在滚动时,不拦截listview的滚动事件;就是listview可以滚动,scrollView.requestDisallowInterceptTouchEvent(true);}return false;}}); 2.关于listview 中 EditText 监听//1.在设置text前,先移除监听if (viewHodler.number.getTag() instanceof TextWatcher) {viewHodler.number.removeTextChangedListener((TextWatcher) viewHodler.number.getTag());}if (TextUtils.isEmpty(phoneNumber.getNumber())){viewHodler.number.setText("");}else {viewHodler.number.setText(phoneNumber.getNumber());}//2.新建监听类TextWatcher watcher = new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {if (TextUtils.isEmpty(s)) {phoneNumber.setNumber(null);finalViewHodler.imageView.setVisibility(View.GONE);} else {phoneNumber.setNumber(s.toString());finalViewHodler.imageView.setVisibility(View.VISIBLE);}Log.e("tag", "afterTextChanged: " +s.toString() );}};//3.添加监听器viewHodler.number.addTextChangedListener(watcher);viewHodler.number.setTag(watcher); 3.获取listview 中所有 Editext 的值 思路:在适配器中创建HashMap 在getview()⽅法中保存所有的Editext key = position value = editext 然后在通过HashMap 获取就⾏了private HashMap<Integer,EditText> edMap;@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {PhoneAdapter.ViewHodler viewHodler = null;if (convertView == null) {viewHodler = new PhoneAdapter.ViewHodler();convertView = LayoutInflater.from(context).inflate(yout.phone_list_item, null, false);viewHodler.spinner = convertView.findViewById(R.id.pnone_spinner);viewHodler.number = convertView.findViewById(R.id.pnone_number);viewHodler.imageView = convertView.findViewById(R.id.imageView4);//put 保存edMap.put(position,viewHodler.number);spMap.put(position,viewHodler.spinner);convertView.setTag(viewHodler);} else {viewHodler = (PhoneAdapter.ViewHodler) convertView.getTag();edMap.put(position,viewHodler.number);spMap.put(position,viewHodler.spinner);} 4.拨打电话功能的坑public void call(String telPhone){if(checkReadPermission(Manifest.permission.CALL_PHONE,REQUEST_CALL_PERMISSION)){//要在telPhone前加上字符串tel:Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + telPhone));startActivity(intent);}} 不让你就会见到下图:。

安卓系统手机通讯录的设计与实现_李宁

安卓系统手机通讯录的设计与实现_李宁

第34卷第4期 辽宁工业大学学报(自然科学版) V ol.34, No.42014年 8 月 Journal of Liaoning University of Technology(Natural Science Edition) Aug.2014收稿日期:2014-02-12基金项目:辽宁省自然科学基金项目(201302022)作者简介:李宁(1979-),女(满族),山东掖县人,讲师,硕士。

本刊核心层次论文安卓系统手机通讯录的设计与实现李 宁,朱清昃,王冬霞(辽宁工业大学 电子与信息工程学院,辽宁 锦州 121001)摘 要:基于安卓系统开发手机通讯录,采用Eclipse+Android+sdk 集成开发环境,运用Java 语言编程。

通过调用系统资源,获取多种服务以及对应的方法,如LocationManager 、SmsManager 等;运用XML 配置文件静态生成用户UI 界面和注册系统应用权限;另外,程序添加了GPS 模块,通过对GPS 设备监听获取用户地理位置信息,实现发送应急短信的功能。

经过测试,该模块可在室外实现用户定位,并且能够监听应急短信的发送和接收状态。

关键词:手机通讯录;安卓系统;Java ;GPS中图分类号:TP311 文献标识码:A 文章编号:1674-3261(2014)04-0211-05Design and Implementation of Mobile Phone Directoryfor Android SystemLI Ning, ZHU Qing-ze, WANG Dong-xia(Electronics & Information Engineering College, Liaoning University of Technology, Jinzhou 121001, China )Abstract: Mobile phone directory based on the Android system was designed, which used the Eclipse+Android+sdk integrated development environment and the Java programming language. Through the usage of the Android system resources, a variety of services and the corresponding methods were accessed, such as LocationManager, SmsManager and so on; the XML configuration file was used to generate static UI user interface and registration system application authority. In addition, the GPS module was added in the design, and the GPS device which was used for the function of sending emergency SMS monitored the user location information. After testing, the module could locate the user outdoor, and monitor the state of emergency SMS sending and receiving.Key words: mobile phone directory; Android system; Java; GPS安卓系统是基于Linux 平台的开放源代码的手机操作系统,该平台由操作系统、中间件、用户界面和应用软件组成。

Android手机电话薄的设计与实现毕业论文

Android手机电话薄的设计与实现毕业论文

本科生毕业论文(申请学士学位)论文题目Android手机通讯录的设计与实现目录摘要 (1)Abstract (1)1绪论 (2)1.1研究背景 (2)1.2 研究方向 (2)1.3前景优势 (3)1.4主要工作和方法 (4)1.5本文结构 (4)2 课题相关技术与理论 (4)2.1Android系统开发简介 (4)2.1.1Android技术简介 (4)2.1.2 Android架构 (6)2.1.3 关键应用程序 (7)2.1.4 应用程序框架 (7)2.1.5 C/C++函数库 (7)2.1.6 Java程序运行环境 (7)2.1.7 Linux内核 (8)2.2 Android应用的构成和工作机制 (8)2.2.1 Activity (8)2.2.2 Intent Receiver (9)2.2.3 Service (9)2.2.4 Content Provider (9)2.3 Android开发平台搭建 (10)3 系统需求分析 (10)3.1业务功能需求分析 (10)3.2 性能需求分析 (11)3.3安全需求 (12)4 系统总体设计 (12)4.1 开发流程和系统数据流图 (12)4.2 详细功能分析 (13)4.3系统模块划分 (14)4.4系统界面绘制 (14)4.5程序设计 (17)4.5.1数据库结构设计 (17)4.5.2menu按键主菜单的建立 (21)4.5.3详细的页面添加设计 (22)4.5.4其他功能设计 (24)5系统测试 (26)5.1测试过程 (26)5.2测试目的 (29)5.3测试方法和工具 (29)参考文献 (30)致谢 (31)Android手机通讯录的设计与实现摘要:随着第三代通信技术3G的推广,无线带宽和传输速度都得到了大幅提升。

为智能手机终端添加更多内容丰富的应用功能提供了良好的平台。

本课题采用谷歌公司新推出的一款基于Linux平台的开源手机操作系统——Android系统,利用Java语言,Eclipse为开发工具对通讯录的代码进行编写。

软件工程毕业设计_基于android系统的同学录的实现

软件工程毕业设计_基于android系统的同学录的实现

河北农业大学本科毕业论文(设计)题目:基于Android系统的同学录的实现摘要随着第三代通信技术3G的推广,无线带宽和传输速度都得到了大幅度提升,为智能手机终端添加更多内容丰富的应用功能提供了良好的平台。

本系统是基于谷歌公司新推出的一款Linux平台的开源手机操作系统——Android系统,利用Java语言,Eclipse为开发工具,通过对平台的系统架构和应用程序进行学习,设计出一款手机通讯录。

本系统包括存储,删除,Android修改,打电话,发信息,发邮件,备份SD卡等功能,满足了用户对通讯录的需求。

此通讯录的设计遵循标准的开发流程,首先进行需求分析,然后确定通讯录的功能,再编写程序的代码,调试程序,运行程序,并对程序进行优化完善。

关键词:Android;手机通讯录;智能手机;JAVAAbstractWith the 3G promotion of third-generation communications technology, wireless bandwidth and transmission speed have been improved significantly, and provides a good platform for smart mobile terminals to add more content-rich applications. The design is based on the Google Corporation a new version of the Linux platform to the source mobile phone operating system -- Android system, using Java language, Eclipse as a development tool, through the Android platform system architecture and application for research, design a mobile phone contacts. The design including functions of storage, deletion, modification, phone calls, messages sending, E-mail sending, backup SD cards and other functions, to meet user demand for mail list. The design of the contacts follows the standard development process, the first needs analysis, and then determine the function of the contacts, then write the code, the debugger, run the program, and procedures to optimize the sound.Key words: Android; Mobile Phone Contacts; Smartphone;Java目录1绪论 (1)1.1研究背景 (1)1.2研究现状 (1)1.3主要工作 (3)2 ANDROID技术与理论 (4)2.1A NDROID系统开发简介 (4)2.1.1 Android技术简介 (4)2.1.2 关键应用程序 (6)2.1.3 应用程序框架 (6)2.1.4 函数库 (6)2.1.5 Linux内核 (6)2.2A NDROID应用的构成和工作机制 (7)2.2.1 Activity (7)2.2.2 Intent Receiver (7)2.2.3 Service (8)2.2.4 Content Provider (8)3需求分析 (9)3.1功能需求分析 (9)3.2性能需求分析 (10)3.3数据库需求分析 (10)3.4安全需求 (11)4功能设计 (12)4.1总体设计 (12)4.2系统功能设计 (13)4.3系统数据库设计 (14)5通讯录实现 (16)5.1A NDROID开发平台搭建 (16)5.2具体功能实现 (16)5.2.1界面布局 (16)5.2.2增加联系人功能 (17)5.2.3查找联系人功能 (18)5.2.4数据库操作实现 (19)5.3系统功能截图 (21)参考文献 (25)致谢 (26)1绪论1.1研究背景智能手机(Smartphone),是指“像个人电脑一样,具有独立的操作系统,可以由用户自行安装软件、游戏等第三方服务商提供的程序,通过此类程序来不断对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接入的这样一类手机的总称”。

自定义view的基本流程

自定义view的基本流程

自定义view的基本流程1.自定义View的意义自定义View是开发Android应用的常见需求,它可以实现各种特殊的UI效果和交互效果。

有时候,自带的一些View无法满足我们的需求,而自定义一个View可以帮助我们实现想要的效果。

2.自定义View的基本流程要实现一个自定义View,通常需要经过以下基本流程:2.1创建自定义View类首先,我们需要创建一个自定义View的类,并继承自View或其子类,比如ImageView、TextView等。

在类中,我们可以重写onMeasure()、onLayout()和onDraw()等方法来实现自定义View的特殊行为。

2.2声明自定义View的属性如果我们希望在XML布局文件中使用自定义View,并可以在代码中设置属性值,就需要在类中声明自定义属性。

这可以通过在res/values/attrs.xml文件中定义属性集合来实现。

2.3实现自定义View的布局在onMeasure()方法中,我们可以指定自定义View在测量时占用的空间大小。

在onLayout()方法中,我们可以指定子View的位置。

2.4实现自定义View的绘制在onDraw()方法中,我们可以通过调用Canvas的API来实现自定义View的绘制效果。

例如,我们可以通过Path绘制自定义的图形,通过Paint设置绘制时的样式和颜色等。

2.5对自定义View进行测试最后,我们需要通过手动测试、单元测试、自动化UI测试等方式,对自定义View进行测试和验证。

3.自定义View的实例以下是一个简单的自定义View实例,用于显示一个可以按下和弹起的按钮:```public class MyButton extends View{private boolean isPressed=false;public MyButton(Context context){super(context);}public MyButton(Context context,AttributeSet attrs) {super(context,attrs);}@Overrideprotected void onDraw(Canvas canvas){super.onDraw(canvas);Paint paint=new Paint();paint.setColor(isPressed?Color.RED:Color.GREEN);canvas.drawRect(0,0,getWidth(),getHeight(), paint);}@Overridepublic boolean onTouchEvent(MotionEvent event){if(event.getAction()==MotionEvent.ACTION_DOWN) {isPressed=true;invalidate();return true;}else if(event.getAction()==MotionEvent.ACTION_UP){isPressed=false;invalidate();return true;}return super.onTouchEvent(event);}}```以上代码中,我们实现了一个MyButton类,当MyButton被按下时,它的背景颜色会变成红色,当MyButton被弹起时,它的背景颜色会回到绿色。

基于android的手机通讯录的设计与实现

基于android的手机通讯录的设计与实现
华东交通大学理工学院
Institute ofTechnology.
EastChinaJiaotongUniversity
毕 业 设 计
GraduationDesign
(2009—2013年)
题 目基于android的手机通讯录的设计与实现
分 院:电气与信息工程分院
专 业:计算机科学与技术
班 级:计科 2009—2
3.1 功能需求分析………………………………………………………………11
3.2 性能需求分析………………………………………………………………12
3.3 数据库需求分析……………………………………………………………12
4通讯录应用的功能设计…………………………………………………………13
4.1 总体设计……………………………………………………………………13
(保密的毕业设计在解密后适用本授权书)
毕业设计作者签名: 指导教师签名:
签字日期: 年 月 日 签字日期: 年 月 日
摘 要
随着移动设备制造技术和移动通信网络的迅猛发展,全球手机用户日益增加,手机成为了很多人日常生活中必不可少的一部分,手机业在日益发展的同时,人们对手机的功能需求和体验需求也越来越高,因此各种智能手机相继而出,当前市场上最流行的智能手机的操作系统非Android莫属。Android是由谷歌公司于2007年11月推出,并很快得到了手机制造商的认可和广大用户的好评。本文以Android系统中的手机通讯录模块为项目背景,利用Java语言,Eclipse为开发工具,主要是对通讯录的版面设计和功能设计的研究,尽可能设计出更具实用性的通讯录程序,本系统包括基本的增加联系人﹑删除联系人﹑查找联系人﹑菜单﹑退出功能,其中菜单包括显示所有﹑删除所有﹑号码备份功能,使通讯录更能切合用户的需求。该通讯录的设计严格按照开发的流程进行。

手机通讯录开发源代码

手机通讯录开发源代码

手机通讯录开发源代码设计开发源代码1.AddContactsActivity类package .demo.pr3;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.EditText;import android.widget.Toast;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*增加记录操作界面*/public class AddContactsActivity extends Activity { private EditText nameEditT ext; //输入框private EditText mobileEditText; //手机输入框private EditText qqEditText; //qqprivate EditText danweiEditText; //单位private EditText addressEditText; //地址Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.edit);setTitle("添加联系人");//从已设置的页面布局查找对应的控件nameEditText=(EditText)findViewById(/doc/10ce63b27ed184254b35eefdc8d376eeafaa17c4.html );mobileEditText=(EditText)findViewById(R.id.mobile); danweiEditText=(EditText)findViewById(R.id.danwei); qqEditText=(EditText)findViewById(R.id.qq);addressEditText=(EditText)findViewById(R.id.address); }/*创建菜单 */public boolean onCreateOptionsMenu(Menu menu) {menu.add(Menu.NONE,1, Menu.NONE, "保存");menu.add(Menu.NONE,2, Menu.NONE, "返回");return super.onCreateOptionsMenu(menu);}/* 菜单事件*/public boolean onOptionsItemSelected(MenuItem item){ // TODO Auto-generated method stubswitch (item.getItemId()) {case 1://保存if(!nameEditText.getText().toString().equals("")){User user=new User();user.setName(nameEditText.getText().toString());user.setMoblie(mobileEditText.getText().toString());user.setDanwei(danweiEditText.getT ext().toString());user.setQq(qqEditT ext.getText().toString());user.setAddress(addressEditText.getText().toString());ContactsTable ct=new ContactsTable(AddContactsActivity.this);if(ct.addData(user)){Toast.makeText(AddContactsActivity.this, "添加成功!",Toast.LENGTH_SHORT).show();finish();}else{Toast.makeText(AddContactsActivity.this, "添加失败!", Toast.LENGTH_SHORT).show();}}else{Toast.makeText(AddContactsActivity.this, "请先输入数据!", Toast.LENGTH_SHORT).show();}break;case 2://返回finish();break;default:break;}return super.onOptionsItemSelected(item);}}2. ContactsMessageActivity类package .demo.pr3;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*显示联系人界面 */public class ContactsMessageActivity extends Activity { private TextView nameTextView; //输入框private TextView mobileTextView; //手机输入框private TextView qqTextView; //qqprivate TextView danweiTextView; //单位private TextView addressTextView; //地址private User user; //修改的联系人Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.message);setTitle("联系人信息");//从已设置的页面布局查找对应的控件nameTextView=(TextView)findViewById(http://www.doczj.co m/doc/10ce63b27ed184254b35eefdc8d376eeafaa17c4.html );mobileTextView=(T extView)findViewById(R.id.mobile); danweiTextView=(TextView)findViewById(R.id.danwei); qqTextView=(TextView)findViewById(R.id.qq);addressTextView=(TextView)findViewById(R.id.address);//将要修改的联系人数据付值到用户界面显示Bundle localBundle = getIntent().getExtras();int id=localBundle.getInt("user_ID");ContactsTable ct=new ContactsTable(this);user =ct.getUserByID(id);nameTextView.setT ext(":"+user.getName());mobileTextView.setText(":"+user.getMoblie());qqTextView.setText("QQ:"+user.getQq()); danweiTextView.setText("单位:"+user.getDanwei()); addressTextView.setText("地址:"+user.getAddress());}/*创建菜单*/public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, 1, Menu.NONE, "返回");return super.onCreateOptionsMenu(menu);}/* 菜单事件 */public boolean onOptionsItemSelected(MenuItem item){ // TODO Auto-generated method stubswitch (item.getItemId()) {case 1://返回finish();break;default:break;}return super.onOptionsItemSelected(item);}}3. MyContactsActivity类package .demo.pr3;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.AlertDialog.Builder;import android.content.ContentUris;import android.content.ContentValues;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Color;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html .Uri;import android.os.Bundle;import android.provider.ContactsContract.RawContacts;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html monDataKinds.Phone;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html monDataKinds.StructuredName; import android.provider.ContactsContract.Contacts.Data;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*主界面*/public class MyContactsActivity extends Activity {private ListView listView; //结果列表private BaseAdapter listViewAdapter; //ListView 列表适配器private User users[];//通讯录用户private int selecteItem=0; //当前选择Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.main);setTitle("通讯录");listView = (ListView) findViewById(R.id.listView);loadContacts();}/*加载联系人列表*/private void loadContacts(){//获取所以通讯录联系人ContactsTable ct=new ContactsTable(this);users=ct.getAllUser();//listView列表现实适配器listViewAdapter=new BaseAdapter() {Overridepublic View getView(int position,View convertView, ViewGroup parent) {if(convertView==null){TextView textView =new TextView(MyContactsActivity.this); textView.setTextSize(22);convertView=textView;}String moblie=users[position].getMoblie()==null?"" :users[position].getMoblie();((TextView)convertView).setText(users[position].getName()+"---"+moblie);if(position==selecteItem){convertView.setBackgroundColor(Color.YELLOW); }else{convertView.setBackgroundColor(0);}return convertView;}Overridepublic long getItemId(int position) {return position;}Overridepublic Object getItem(int position) {return users[position];}Overridepublic int getCount() {return users.length;}};//设置listView控件的适配器listView.setAdapter(listViewAdapter);listView.setOnItemClickListener(new OnItemClickListener() { Overridepublic void onItemClick(AdapterView arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stub//记录点击列selecteItem=arg2;//刷新列表listViewAdapter.notifyDataSetChanged();}});}/*创建菜单*/public boolean onCreateOptionsMenu(Menu menu) {menu.add(Menu.NONE, 1, Menu.NONE, "添加");menu.add(Menu.NONE, 2, Menu.NONE, "编辑");menu.add(Menu.NONE, 3, Menu.NONE, "查看信息");menu.add(Menu.NONE, 4, Menu.NONE, "删除");menu.add(Menu.NONE, 5, Menu.NONE, "查询");menu.add(Menu.NONE, 6, Menu.NONE, "导入到手机薄");menu.add(Menu.NONE, 7, Menu.NONE, "退出");return super.onCreateOptionsMenu(menu);}/*菜单事件*/public boolean onOptionsItemSelected(MenuItem item){// TODO Auto-generated method stubswitch (item.getItemId()) {case 1://添加Intent intent = new Intent(MyContactsActivity.this,AddContactsActivity.class);startActivity(intent);break;case 2://编辑if(users[selecteItem].getId_DB()>0)//根据数据库ID判断当前记录是否可以操作{intent = new Intent(MyContactsActivity.this,UpdateContactsActivity.class);intent.putExtra("user_ID", users[selecteItem].getId_DB());startActivity(intent);}else{Toast.makeText(this, "无结果记录,无法操作!",Toast.LENGTH_SHORT).show();}break;case 3://查看信息if(users[selecteItem].getId_DB()>0){intent = new Intent(MyContactsActivity.this,ContactsMessageActivity.class);intent.putExtra("user_ID", users[selecteItem].getId_DB());startActivity(intent);}else{Toast.makeText(this, "无结果记录,无法操作!",Toast.LENGTH_SHORT).show();}break;case 4://删除if(users[selecteItem].getId_DB()>0){delete();}else{Toast.makeText(this, "无结果记录,无法操。

Android通讯录小软件(可以导入手机上的联系人、发短信、打电话、增加、修改联系人等)

Android通讯录小软件(可以导入手机上的联系人、发短信、打电话、增加、修改联系人等)

Android通讯录这是本人学习android一个月以来的第一个比较实用的小程序,此程序可以读取手机自带通讯录上的所有联系人,并且可以导入到这个通讯录列表,不用用户一个一个地输入,将导入的联系人信息保存在SQLite3数据库中,还具有向指定联系人发送短信、打电话、增加、修改联系人等基本功能。

效果图如下所示:代码如下(直接复制即可掩饰效果):====================== DatabaseHelper======================= package liu.sqlite3.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.database.sqlite.SQLiteDatabase.CursorFactory;//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作public class DatabaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;//在SQLiteOepnHelper的子类当中,必须有该构造函数public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {//必须通过super调用父类当中的构造函数super(context, name, factory, version);// TODO Auto-generated constructor stub}public DatabaseHelper(Context context,String name){this(context,name,VERSION);}public DatabaseHelper(Context context,String name,int version){this(context, name,null,version);}//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a Database");//execSQL函数用于执行SQL语句db.execSQL("create table user(name varchar(20),phone text,qq text,mail text,address text)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a Database");}}package net.yxarm;import java.util.ArrayList;import java.util.HashMap;import liu.sqlite3.db.DatabaseHelper;import android.app.Activity;import android.content.ContentValues;import android.content.Intent;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class Add_people extends Activity {private EditText editName = null;private EditText editPhone = null;private EditText editQQ = null;private EditText editEmail = null;private EditText editAddress = null;private Button buttonAdd = null;private Button buttonCancel = null;public static int n ;//==============重写Activity中创建Activity的方法========================================@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.second);editName = (EditText) findViewById(R.id.edit_name);editPhone = (EditText) findViewById(R.id.edit_phone);editQQ = (EditText) findViewById(R.id.edit_QQ);editEmail = (EditText) findViewById(R.id.edit_mail);editAddress = (EditText) findViewById(R.id.edit_address);buttonAdd = (Button) findViewById(R.id.button1_add);buttonCancel= (Button) findViewById(R.id.button2_cancel);//判断是否是修改联系人还是重新创建,修改的话将原始信息重新填写到编辑框内,然后下面根据n的值决定调用新建还是修改数据的方法Intent intent = getIntent(); //接收上一个Activity通过intent传过来的数据n = intent.getIntExtra("editpeople", 0);if(n == 1){System.out.println("----上一个Activity传进来的(editpeople)值:" + n);editName.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("name").toString()); editPhone.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("phone").toString());editQQ.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("qq").toString());editEmail.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("mail").toString());editAddress.setText(Address_Book.LIST.get(Address_Book.CLICK_ID).get("address").toString());}//设置两个按钮监听事件buttonAdd.setOnClickListener(new MyButtonOnClickListener());buttonCancel.setOnClickListener(new MyButtonOnClickListener());}//======================两个按钮监听处理事件============================================class MyButtonOnClickListener implements OnClickListener {private static final int REQUESCODE2 = 2;public void onClick(View v) {switch(v.getId()) {case R.id.button1_add: //--------------------确定添加此联系人//判断联系人是否可以添加(如:姓名不能为空、电话要有效)if(editName.getText().toString().length()>0 & editPhone.getText().toString().length()>=3 ) {CreateDatabaseHelper(); //创建数据库,将联系人信息保存到数据库(若数据库存在则不会重建)if(n != 1) { //新建联系人,若是修改联系人则不会再添加Address_Book.LIST = Insert(); //返回全部数据给LIST静态列表变量Toast.makeText(Add_people.this, "添加成功", 1).show();System.out.println(".......选择新建联系人");}else if(n == 1) { //修改联系人(n:是点击了修改联系人后传进来的值)Address_Book.LIST = modfiy(); //返回全部数据给LIST静态列表变量Toast.makeText(Add_people.this, "修改成功", 1).show();System.out.println(".......选择修改联系人");}//返回到第一个Activity中显示(所有数据已经保存在LIST静态列表变量中)Intent intent = new Intent();intent.setClass(Add_people.this,Address_Book.class);intent.putExtra("nothing2", 2);startActivityForResult(intent, REQUESCODE2);}else if(editName.getText().toString().equals("")){ //没有输入名字不能添加Toast.makeText(Add_people.this, "请输入联系人姓名", 1).show();}else if( editPhone.getText().toString().length()<3 ) { //电话无效不能添加Toast.makeText(Add_people.this, "请输入有效电话", 1).show();}break;case R.id.button2_cancel: //------------------取消此联系人的添加回到列表界面Toast.makeText(Add_people.this, "取消", 1).show();Intent intent = new Intent(Add_people.this,Address_Book.class);startActivity(intent);break;default: break;}}}//================================创建数据库==========================================public void CreateDatabaseHelper() {//创建一个DatabaseHelper对象DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db");//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库SQLiteDatabase db = dbHelper.getReadableDatabase();}//===========================插入数据并返回全部数据list================================public ArrayList Insert() {//---------------插入新数据-----------------//生成ContentValues对象ContentValues values = new ContentValues();//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致values.put("name",editName.getText().toString());values.put("phone",editPhone.getText().toString());values.put("qq",editQQ.getText().toString());values.put("mail",editEmail.getText().toString());values.put("address",editAddress.getText().toString());DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getWritableDatabase();//调用insert方法,就可以将数据插入到数据库当中db.insert("user", null, values);//------将更新后的全部数据返回---------//定义一个键值对数组将数据返回到第一个列表Activity中更新进行显示ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();DatabaseHelper dbHelper1 = new DatabaseHelper(Add_people.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();Cursor cursor = db1.query("user", new String[]{"name","phone","qq","mail","address"}, null, null, null, null, null);while(cursor.moveToNext()){HashMap<String, Object> map = new HashMap<String, Object>();map.put("name", cursor.getString(cursor.getColumnIndex("name")));map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));map.put("qq", cursor.getString(cursor.getColumnIndex("qq")));map.put("mail", cursor.getString(cursor.getColumnIndex("mail")));map.put("address", cursor.getString(cursor.getColumnIndex("address")));}return list; //返回全部数据list用于列表显示}//===========================查询所有数据=================================== public void Query(){DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db");SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query("user", new String[]{"name","phone","qq","mail","address"},"name=?", new String[]{editName.getText().toString()}, null, null, null);while(cursor.moveToNext()){String name1 = cursor.getString(cursor.getColumnIndex("name"));String name2 = cursor.getString(cursor.getColumnIndex("phone"));String name3 = cursor.getString(cursor.getColumnIndex("qq"));String name4 = cursor.getString(cursor.getColumnIndex("mail"));String name5 = cursor.getString(cursor.getColumnIndex("address"));System.out.println("query--->" + name1);System.out.println("query--->" + name2);System.out.println("query--->" + name3);System.out.println("query--->" + name4);System.out.println("query--->" + name5);System.out.println("======================================================");}}//===========================更新(修改)数据===================================public ArrayList modfiy(){//生成ContentValues对象ContentValues values = new ContentValues();//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致values.put("name",editName.getText().toString());values.put("phone",editPhone.getText().toString());values.put("qq",editQQ.getText().toString());values.put("mail",editEmail.getText().toString());values.put("address",editAddress.getText().toString());DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getWritableDatabase();System.out.println("************修改联系人之前: " + Address_Book.LIST.get(Address_Book.CLICK_ID).toString());db.update("user", values, "name = ?", new String[]{Address_Book.LIST.get(Address_Book.CLICK_ID).get("name").toString()});//------将更新后的全部数据返回---------//定义一个键值对数组将数据返回到第一个列表Activity中更新进行显示ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();DatabaseHelper dbHelper1 = new DatabaseHelper(Add_people.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();Cursor cursor = db1.query("user", new String[]{"name","phone","qq","mail","address"}, null, null, null, null, null);while(cursor.moveToNext()){HashMap<String, Object> map = new HashMap<String, Object>();map.put("name", cursor.getString(cursor.getColumnIndex("name")));map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));map.put("qq", cursor.getString(cursor.getColumnIndex("qq")));map.put("mail", cursor.getString(cursor.getColumnIndex("mail")));map.put("address", cursor.getString(cursor.getColumnIndex("address")));}return list; //返回全部数据list用于列表显示}}================== Address_Book=========================package net.yxarm;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import liu.sqlite3.db.DatabaseHelper;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.AlertDialog.Builder;import android.content.ContentResolver;import android.content.ContentValues;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.graphics.Color;import .Uri;import android.os.Bundle;import android.provider.ContactsContract;import android.provider.ContactsContract.PhoneLookup;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.view.MenuItem.OnMenuItemClickListener;import android.view.View.OnFocusChangeListener;import android.view.View.OnLongClickListener;import android.view.View.OnTouchListener;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemSelectedListener;public class Address_Book extends Activity {private AutoCompleteTextView autotext = null ; //快速查找时对话框中的控件autoTextViewprivate static List<String> listCheck = new ArrayList<String>(); //将所有人的名字保存这数组中实现autoTextViewprivate static final int REQUESCODE1 = 1; //Activity之间传递数据用的startActivityForResult(intent, REQUESCODE);public static int CLICK_ID = 600 ; //保存选中需要删除的id号,默认设置为600表示没选中联系人private ListView listview = null; //列表显示所有联系人数据private SimpleAdapter simpleadapter = null; //适配器public static ArrayList<HashMap<String, Object>> LIST = new ArrayList<HashMap<String,Object>>(); //静态变量,别的Activity使用要用类名引用//==============重写Activity中创建Activity的方法========================================@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.first);Toast.makeText(Address_Book.this, "欢迎使用^@^", 1).show();CLICK_ID = 600 ; //返回这里是都将CLICK_ID初始化为无效值(所以没有点击联系人是不会执行删除、修改动作)//接收mainActivity通过intent传过来的数据,然后判断是否显示快速查找对话框Intent intent1 = getIntent();int n = intent1.getIntExtra("Search_flag", 0);System.out.println("MainActivity传进来的(Search_flag)值:" + n);if(n == 1) {dialogShow(); //显示对话框快速查找}//先查询所有联系人数据并显示出来LIST = Query(); //查询所有联系人并返回到listint size = LIST.size();//---------------------打印输出测试----------------------------System.out.println("---------------->>>>> " + size);for(int i=0;i<size;i++) {System.out.println( Address_Book.LIST.get(i).toString());}listview=(ListView) findViewById(R.id.listview);//注册快捷菜单(长按textView大于2秒就可以弹出快捷菜单)registerForContextMenu(listview);//取消注册//unregisterForContextMenu(textView);simpleadapter = new SimpleAdapter(this, LIST, yout.listviewitem,new String[]{"name","phone"} , new int[]{1,R.id.phone1});listview.setAdapter(simpleadapter);//(点击事件)联系人列表选中单项监听事件,将选中的位置传给静态变量CLICK_ID = position,并Toast提示语listview.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view,int position, long id) {CLICK_ID = position; //将选中列表的那个的位置传给静态变量CLICK_ID//Toast.makeText(Address_Book.this, "想"+LIST.get(CLICK_ID).get("name").toString()+"啦^@^", 1).show();System.out.println("--Click选中--CLICK_ID-:" + CLICK_ID );//点击后显示背景色绿色if (((ListView)parent).getTag() != null) {((View)((ListView)parent).getTag()).setBackgroundDrawable(null);}((ListView)parent).setTag(view);view.setBackgroundColor(Color.GREEN);}});//(选中事件)联系人列表选中单项监听事件,将选中的位置传给静态变量CLICK_ID = position,并Toast提示语listview.setOnItemSelectedListener(new OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent, View view,int position, long id) {CLICK_ID = position; //将选中列表的那个的位置传给静态变量CLICK_ID// Toast.makeText(Address_Book.this, "想"+LIST.get(CLICK_ID).get("name").toString()+"啦^@^", 1).show();System.out.println("--Selected选中--CLICK_ID-:" + CLICK_ID );//点击后显示背景色红色if (((ListView)parent).getTag() != null) {((View)((ListView)parent).getTag()).setBackgroundDrawable(null);}((ListView)parent).setTag(view);view.setBackgroundColor(Color.GREEN);}public void onNothingSelected(AdapterView<?> parent) {}});}//==============重写Activity中创建菜单的方法=============================================@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//添加菜单方法2//第一个参数:组//第一个参数:id//第一个参数:排序//第一个参数:菜单名字menu.add(0,0, 0, "从手机导入联系人").setIcon(R.drawable.go);menu.add(0,1, 0, "添加联系人").setIcon(R.drawable.go).setShortcut('1', 'b'); //'b'是快捷键menu.add(0,2, 0, "快速查询").setIcon(R.drawable.jiji);menu.add(0,3, 0, "删除联系人").setIcon(R.drawable.jiji);menu.add(0,4, 0, "拨号").setIcon(oren);menu.add(0,5, 0, "发送短信").setIcon(R.drawable.jiji);menu.add(0,6, 0, "修改联系人").setIcon(R.drawable.jiji);/*//添加菜单方法3//inflater过滤器,后面的menu是public boolean onCreateOptionsMenu(Menu menu)传进来的//前面的menu是引用自己新建的menu.xml文件的ID,里面设置好了所有菜单MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu, menu);*/return true;}//==============重写Activity中的主菜单监听事件的方法,根据按下的菜单做相应处理============@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if(item.getItemId() == 0) { //从手机中导入联系人Toast.makeText(Address_Book.this, "正在导入,请稍后···", 3).show();getContactInformation(); //将手机上的联系人导入列表Toast.makeText(Address_Book.this, "导入完成", 3).show();Intent intent = new Intent(Address_Book.this,Address_Book.class);startActivity(intent);} else if(item.getItemId() == 1) { //添加联系人,转到另一个ActivityIntent intent = new Intent();intent.setClass(Address_Book.this,Add_people.class);intent.putExtra("nothing1", 1);startActivityForResult(intent, REQUESCODE1);}else if(item.getItemId() == 2) { //快速查找,弹出对话框dialogShow(); //显示对话框快速查找}else if(item.getItemId() == 3) { //删除联系人if(CLICK_ID != 600) {dialogShow_dele();} else {Toast.makeText(Address_Book.this, "请选择需要删除的联系人", 1).show();}}else if(item.getItemId() == 4) { //拨号if(CLICK_ID != 600) {Intent intent = new Intent();Uri uri ;String data ;data = "tel:"+LIST.get(CLICK_ID).get("phone").toString();uri = Uri.parse(data);intent.setAction(Intent.ACTION_CALL);intent.setData(uri);startActivity(intent);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}}else if(item.getItemId() == 5) { //发送短信if(CLICK_ID != 600) {Intent intent = new Intent();intent.putExtra("phone_num", LIST.get(CLICK_ID).get("phone").toString()); //将选中的号码传过去intent.putExtra("name", LIST.get(CLICK_ID).get("name").toString()); //将选中的名字传过去intent.setClass(Address_Book.this, SendMessage.class);startActivityForResult(intent, 1);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}}else if(item.getItemId() == 6) { //修改联系人if(CLICK_ID != 600) {System.out.println("************点击了修改联系人: " + LIST.get(CLICK_ID).get("name").toString());Intent intent = new Intent(); //跳转到编辑Activity,并发送编辑联系人标志("editpeople", 1)intent.setClass(Address_Book.this,Add_people.class);intent.putExtra("editpeople", 1); //根据这个参数(键值对)选择是否修改还是重新创建联系人startActivityForResult(intent, REQUESCODE1);} else {Toast.makeText(Address_Book.this, "请选择需要修改的联系人", 1).show();}}return true;}//=================创建一个对话框(快速查找时会弹出)=================================private void dialogShow() {//创建一个对话框AlertDialog.Builder builder = new Builder(this);//设置图标builder.setIcon(R.drawable.jiji);//设置标题builder.setTitle("快速查找联系人").setIcon(oren);//设置文本信息builder.setMessage("请输入'空格+第一个字':").setIcon(R.drawable.jiji);//设置编辑框autotext = new AutoCompleteTextView(this);//创建一个ArrayAdapter对象ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,yout.autocoplist_item,listCheck);//将ArrayAdapter设置给AutoCompleteTextView对象autotext.setAdapter(arrayAdapter);builder.setView(autotext);//设置两个按钮,并设置按钮监听事件builder.setPositiveButton("确定", new MyOnClickListener());builder.setNegativeButton("取消", new MyOnClickListener());//创建显示对话框(必须)builder.create().show();}//=======对话框的"确定"、"取消"按钮监听事件处理(查找时)============class MyOnClickListener implements android.content.DialogInterface.OnClickListener {public void onClick(DialogInterface dialog, int which) {switch(which) {case Dialog.BUTTON_POSITIVE ://将查到的这个联系人找到并显示在可视界面String strname = autotext.getText().toString();listview.setSelection(listCheck.indexOf(strname));break;case Dialog.BUTTON_NEGATIVE :System.out.println("按下取消");break;}}}//=================删除时弹出一个对话框================================private void dialogShow_dele() {//创建一个对话框AlertDialog.Builder builder = new Builder(this);//设置图标builder.setIcon(R.drawable.jiji);//设置标题builder.setTitle(" 对话框").setIcon(oren);//设置文本信息builder.setMessage(" 确定删除吗?").setIcon(R.drawable.jiji);//设置两个按钮,并设置按钮监听事件builder.setPositiveButton("确定", new My1OnClickListener());builder.setNegativeButton("取消", new My1OnClickListener());//创建显示对话框(必须)builder.create().show();}//===========对话框的"确定"、"取消"按钮监听事件处理(删除时)===============class My1OnClickListener implements android.content.DialogInterface.OnClickListener {public void onClick(DialogInterface dialog, int which) {switch(which) {case Dialog.BUTTON_POSITIVE :deleteItem(); //调用上面的删除数据库中对应数据的方法System.out.println("==============删除: " + LIST.get(CLICK_ID).get("name").toString());System.out.println("-------删除联系人--------------"+CLICK_ID);break;case Dialog.BUTTON_NEGATIVE :System.out.println("按下取消");break;}}}//===========================查询所有数据==============================================public ArrayList Query() {//------将更新后的全部数据返回---------//定义一个键值对数组将数据返回到第一个列表Activity中更新进行显示ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();DatabaseHelper dbHelper1 = new DatabaseHelper(Address_Book.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();Cursor cursor = db1.query("user", new String[]{"name","phone","qq","mail","address"}, null, null, null, null, null);while(cursor.moveToNext()){HashMap<String, Object> map = new HashMap<String, Object>();map.put("name", cursor.getString(cursor.getColumnIndex("name")));map.put("phone", cursor.getString(cursor.getColumnIndex("phone")));map.put("qq", cursor.getString(cursor.getColumnIndex("qq")));map.put("mail", cursor.getString(cursor.getColumnIndex("mail")));map.put("address", cursor.getString(cursor.getColumnIndex("address")));listCheck.add(" " + cursor.getString(cursor.getColumnIndex("name")));//为了将所有人的名字保存数组中实现autoTextViewlist.add(map);}return list; //返回全部数据list用于列表显示}//===========================删除其中的一条数据===================================================public void deleteItem() {DatabaseHelper dbHelper1 = new DatabaseHelper(Address_Book.this,"test_mars_db");SQLiteDatabase db1 = dbHelper1.getReadableDatabase();db1.delete("user", "name=?", new String[]{LIST.get(CLICK_ID).get("name").toString()});System.out.println("||||||||||||||||||||删除"+LIST.get(CLICK_ID).get("name").toString()+" 成功");//删除联系人以后刷新联系人界面,跳转到当前界面,重新显示更新后的联系人列表Intent intent = new Intent();intent.setClass(Address_Book.this, Address_Book.class);startActivity(intent);}//================重写方法,添加快捷菜单,长按textView大于2秒就可以弹出快捷菜单=============================//在Activity中注册快捷菜单:registerForContextMenu(textView);@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {Toast.makeText(Address_Book.this, "你想对"+LIST.get(CLICK_ID).get("name").toString()+"干嘛^@^", 1).show();menu.add("拨号").getIcon();menu.add("发送短信息").setIcon(oren);menu.add("修改联系人").setIcon(R.drawable.jiji);menu.add("删除联系人").setIcon(oren);}//===================================快捷菜单监听事件===================================================@Overridepublic boolean onContextItemSelected(MenuItem item) {if(item.toString().equals("删除联系人")) {if(CLICK_ID != 600) {dialogShow_dele();} else {Toast.makeText(Address_Book.this, "请选择需要删除的联系人", 1).show();}} else if(item.toString().equals("修改联系人")) {if(CLICK_ID != 600) {System.out.println("************点击了修改联系人: " + LIST.get(CLICK_ID).get("name").toString());Intent intent = new Intent(); //跳转到编辑Activity,并发送编辑联系人标志("editpeople", 1)intent.setClass(Address_Book.this,Add_people.class);intent.putExtra("editpeople", 1); //根据这个参数(键值对)选择是否修改还是重新创建联系人startActivityForResult(intent, REQUESCODE1);} else {Toast.makeText(Address_Book.this, "请选择需要修改的联系人", 1).show();}}else if(item.toString().equals("拨号")) {if(CLICK_ID != 600) {Intent intent = new Intent();Uri uri ;String data ;data = "tel:"+LIST.get(CLICK_ID).get("phone").toString();uri = Uri.parse(data);intent.setAction(Intent.ACTION_CALL);intent.setData(uri);startActivity(intent);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}} else if(item.toString().equals("发送短信息")) {if(CLICK_ID != 600) {Intent intent = new Intent();intent.putExtra("phone_num", LIST.get(CLICK_ID).get("phone").toString()); //将选中的号码传过去intent.putExtra("name", LIST.get(CLICK_ID).get("name").toString()); //将选中的名字传过去intent.setClass(Address_Book.this, SendMessage.class);startActivityForResult(intent, 1);}else {Toast.makeText(Address_Book.this, "请选择一个号码", 1).show();}}return super.onContextItemSelected(item);}//====================下面的3个方法,读取手机上电话联系人Contact的信息并导入列表===============================//============读取手机上电话联系人Contact的信息(为了将所有联系人导入列表)============================public void getContactInformation() {//得到ContentResolver对象ContentResolver cr = getContentResolver();//取得电话本中开始一项的光标Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()){// 取得联系人名字int nameFieldColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);String name = cursor.getString(nameFieldColumnIndex);// string += (name);// 取得联系人IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));Cursor phone = cr.query(monDataKinds.Phone.CONTENT_URI, null, monDataKinds.Phone.CONTACT_ID + " = "+ contactId, null, null);// 取得电话号码(可能存在多个号码)while (phone.moveToNext()){String strPhoneNumber = phone.getString(phone.getColumnIndex(monDataKinds.Phone.NUMBER));// string += (":" + strPhoneNumber);/* System.out.println("$$$获得联系人名字:" + name);System.out.println("$$$获得联系人电话:" + strPhoneNumber);System.out.println("=========================================");*/String str = Query2(name); //先判断是否存在此人if(str == null) {insret_Contant(name,strPhoneNumber);System.out.println("============可以导入--------------");} else {System.out.println("==========已经存在此人-------------");}}// string += "\n";phone.close();}cursor.close();}。

基于安卓系统的通讯录设计文档

基于安卓系统的通讯录设计文档

基于安卓系统的通讯录设计⽂档Android项⽬报告———通讯录第⼀章项⽬介绍本项⽬是使⽤eclipse开发平台,并连接使⽤SQlite数据库编写的通讯录。

分为后台数据库的建⽴和维护,以及前端应⽤程序的开发两个部分,主要包括添加、删除、修改联系⼈姓名、电话、住址等。

1.功能需求分析:当今社会是信息⾼速发展的时代,朋友圈也逐渐得到扩展,⽽⼈与⼈之间的联系也愈加密切,准确详细并安全的保存需要联系的⼈的信息则显得更加重要。

2.功能模块分析:(1)查询所有联系⼈模块:可以查询所有添加成功的联系⼈的信息。

(2)搜索联系⼈模块:可以按照关键字进⾏搜索。

(3)新联系⼈模块:可以添加新联系⼈的信息。

3.数据流图:数据流图(DFD)是⼀种图形化技术,它描绘信息流和数据从输⼊移动到输出的过程中所经受的变换。

按照系统的业务流程来分析系统中的信息流向,可画出系统的数据流图如下:第⼆章、系统概要设计1.外部事件该图描述了通讯录与外部环境的交互,在这个系统中,通过对系统的分析,可以识别出参与者:⽤户。

对于⽤户⽽⾔,通讯录上按钮是⽤户向系统输⼊的操作请求的输⼊设备,GUI是⽤于向⽤户输出的输出设备。

2.数据增加流程图:3.数据修改流程图:4.数据删除流程图:第三章界⾯显⽰1.图标2.主界⾯界⾯展⽰:3.点击menu,选择添加,退出功能。

4.点击“添加联系⼈”3,点击已经创建的条⽬,进⼊具体内容4,在具体内容中点击menu也会出现相关的菜单点击“编辑联系⼈”点击呼叫点击发送信息第四章实验⼼得通过此项⽬,我了解到Android开发所使⽤的数据库SQlite的相关知识,同时对于DatabaseHelper更加加深的体会,我对这个app的了,在完成这个项⽬的过程中,也遇到⼀些问题,经过⽼师与同学的耐⼼指导与解答,通过在⽹上寻找学习资料,我终于顺利完成了项⽬的编写,在此感谢帮助我的⽼师与同学的帮助。

基于Android的个性化手机通讯录设计

基于Android的个性化手机通讯录设计

基于Android的个性化手机通讯录设计作者:段月媛郑登辉来源:《软件导刊》2014年第07期摘要:传统的手机通讯录比较单一,缺乏一些相对智能便捷的功能。

针对用户对通讯录的要求,设计并实现了在Android系统上运行的手机通讯管理软件,除了实现手机通讯录的基本功能外,还新增了头像选择、个人空间、数据备份与还原、模糊查询、选择单个和多个联系人等特色功能。

经系统测试达到了预期目标。

关键词:手机通讯录管理软件;Android移动开发平台;智能化操作中图分类号:TP302文献标识码:A文章编号:1672 7800(2014)007 0006 03基金项目:2013湖北省大学生创业创新训练项目0引言手机是当下人们沟通的重要工具,手机通讯录是必不可少的软件,目前大部分手机使用的是 Android系统,本手机通讯录软件正是基于Android系统,具有良好的市场前景。

本款软件以Java语言为基础,结合Android移动开发平台,并利用Android提供的SDK,实现在Android平台上的运行。

不仅具有传统的手机通讯功能,还增加了独特的头像选择、个人空间、模糊查询、单选或多选等功能。

1系统设计1.1技术准备1.1.1Android开发4大组件活动(Activity):Activity是所有运行程序的基础,任何程序都运行于其基础之上。

一个Android应用有多个Activity,而它们之间可以实现相互跳转。

服务(Service):是Android系统中的一种组件,但是只能在后台运行,可与其它相关组件交互,是一种可长时间运行的程序,没有用户界面。

广播接收器(BroadcastReceiver):是一类组件,完成对发送出的Broadcast进行过滤接收并响应的操作,同时可让应用程序对外部事件作出响应。

但是它无法生成UI,故而对用户而言不是透明的。

内容提供商(Content Provider):可屏蔽内部数据的存储细节,向外提供统一的接口模型,抽象层次,大大简化上层应用的书写,为数据整合提供方便,作用相当于数据库。

安卓课程设计--手机通讯录

安卓课程设计--手机通讯录

通信综合课程设计报告——手机通讯录姓名:合作者:专业班级:通信1002学号: 31006010指导老师:设计日期: 2014.01.08~2014.01.10第一章开发内容概述随着移动通信与Internet向移动终端的普及,网络和用户对移动终端的要求越来越高,而Symbian,Windows Mobile,PalmOS等手机平台过于封闭,不能很好的满足用户的需求,因此市场迫切需要一个开发性很强的平台。

经过多年的发展,第三代数字通信(3G)技术活动了广泛的接受,它为移动终端用户带来了更快的数据传输速率。

随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。

因此,移动终端的应用软件和需要的服务将会有很大的发展空间。

Google为此与2007年11月推出了一个专为移动设备设计的软件平台——Android。

Android 是一套真正意义上的开发性的移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。

Android 是由Linux+Java构成的开源软件,允许所有厂商和个人在其基础上进行开发。

Android平台的开放性等特点既能促进技术(包括平台本身)的创新,又有助于降低开发成本,还可以是运营商能非常方便地制定自己的特色化的产品。

因此,它具有很大的市场发展潜力。

Android(Google公司)是Google开发的基于Linux平台的开源手机操作系统。

它包括操作系统、用户界面和应用程序——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。

谷歌与开放手机联盟合作开发了 Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和 T-Mobile 在内的 30 多家技术和无线应用的领军企业组成。

优点:具备触摸屏、高级图形显示和上网功能,界面强大,可以说是一种融入全部Web应用的单一平台。

缺点:由于时时刻刻都需要和网络进行连接,因此在手机的能耗方面控制就较差,导致待机能力不足;又由于其开源性,过分依赖开发商,缺少标准配置。

自定义view的绘制流程

自定义view的绘制流程

自定义view的绘制流程自定义View的绘制流程。

在Android开发中,自定义View是非常常见的需求,通过自定义View可以实现各种炫酷的效果,满足各种个性化的设计需求。

但是,自定义View的绘制流程并不是那么简单,需要我们对View的绘制机制有一定的了解,才能够高效地实现自定义View的绘制。

本文将从自定义View的基本概念开始,逐步介绍自定义View的绘制流程。

1. 自定义View的基本概念。

自定义View是指在Android开发中,通过继承View或者ViewGroup来创建自定义的UI控件。

通过自定义View,我们可以实现各种各样的UI效果,比如自定义的按钮样式、进度条样式、图表样式等。

自定义View的核心就是重写View或者ViewGroup的绘制方法,以实现我们所需的UI效果。

2. 自定义View的绘制流程。

自定义View的绘制流程可以分为以下几个步骤:(1)onMeasure,测量View的大小。

在onMeasure方法中,我们需要通过调用setMeasuredDimension方法来设置View的大小。

在这个方法中,我们需要考虑View的宽度和高度,以及View的测量模式。

通常情况下,我们需要根据View的内容和父容器的大小来计算View的大小,并根据测量模式来确定View的最终大小。

(2)onLayout,确定View的位置。

在onLayout方法中,我们需要通过调用layout方法来确定View在父容器中的位置。

在这个方法中,我们需要考虑View的左上右下四个位置,以及父容器的大小和布局方式,来确定View的最终位置。

(3)onDraw,绘制View的内容。

在onDraw方法中,我们需要通过Canvas来绘制View的内容。

在这个方法中,我们可以使用各种绘制方法来绘制文字、图形、图片等内容,以实现我们所需的UI效果。

在绘制过程中,我们还可以通过Paint来设置绘制的样式、颜色、字体等属性,以实现更加丰富的UI效果。

android程序设计报告(手机通讯录)

android程序设计报告(手机通讯录)

Android实验报告课程名称 Android应用程序开发题目名称 Android通讯录学生学院计算机学院班级学号学生姓名指导教师2012年06 月11日一.程序名称:Android通讯录二.主要功能:本手机通讯录工具主要实现五大功能:联系人的查询:字段查询,分组查询,字母排序查询;增加、删除联系人以及修改联系人信息;导入、导出联系人;发送联系人信息;设置。

三.功能实现概述:2.1 UI设计我们用一个ListView来显示整个通讯录,其中用TextView显示每一记录,他们的xml文件分别为:通讯录主界面,添加联系人界面,浏览联系人界面,查找联系人界面。

2.2 数据库的设计Android中的android.database.sqlite.SQLiteOpenHelper 类是一个专门用于数据库创建和版本管理的辅助类。

因此,为了更好的管理数据库,这里我们创建一个继承自SQLiteOpenHelper的辅助类DBHelper来维护和更新数据库。

2.3功能的设计为了在主界面中浏览联系人的信息,并且创建主要菜单栏,我们设计了MainActivity类,主要用于显示联系人信息和菜单栏,通过菜单栏,实现通讯录的相关功能。

AddressBook类主要是为了实现联系人的添加功能,并且实现信息的保存后跳转到主界面。

Findactivity类主要是为了实现联系人的查找功能,输入联系人的姓名,点击查找按钮,显示所查联系人的相关信息。

四.程序截图:测试手机:三星Galaxy Nexus手机系统版本:4.0.2模拟环境:安卓4.0.3图1:主界面 1 图2:主界面2图3:主界面3 图4:创建联系人图5:编辑联系人 图6:删除联系人五. 课程总结通过设计该通讯录,主要学习了UI 设计、数据库的综合操作、动态菜单的使用以及各种权限的注册。

通过本次设计,使我对Android 平台的数据库操作有了更进一步的理解,同时也对Android 系统有了更深入的了解。

Android编写的通讯录以及实验报告

Android编写的通讯录以及实验报告

课程名称Android高级编程班级11sf01 实验日期2013-09-10姓名学号指导教师周景实验成绩95一、实验名称Android开发基础实验二、实验目的及要求1,创建一个联系人的类Contact作为联系人对象的抽象,联系人类的可以包含属性包括:姓名,电话,手机号码,Email,QQ号码,备注信息等等;2,利用联系人类可以实例化联系人对象,例如一个联系人对象的信息可以是:(姓名,张三),(电话,12345678),(手机号码,133****5678),(Email,******************),其他的信息为空。

3,使用XML布局文件创建一个显示联系人信息的界面,在Activity中使用代码加载这个界面。

三、实验环境PC, Android SDK, Eclipse四、实验内容创建一个显示联系人信息的界面五、过程及实验结果1, 任务一:在Eclipse中创建一个Android Application Project,选择合适的应用名称,例如:Contacts、AddressBook或者其他有自己特色的名字,选择合适的Package名称,例如:su.contacts。

2,在工程中创建一个新的Class,名称是Contact,下面是Contact 类的参考实现。

3,实例化一个Contact对象。

4,任务三:使用XML布局文件创建一个显示联系人信息的界面,参考实现如下(注意:用于显示姓名,手机和电子邮件的三个TextView 控件设置了android:id属性,该属性的值作为参数来调用Activity 的findViewById方法就可以获取这三个TextView控件的引用)。

5,任务四:通过findViewById方法获取三个TextView对象,然后调用TextView的setText方法设置显示的文字信息。

六、实验小结1、任务一:在Eclipse中创建一个Android Application Project,名称:Contact;Package,名称:su.contacts。

Android编辑联系人

Android编辑联系人

Android编辑联系⼈/*** @brief 显⽰联系⼈编辑界⾯* */public void editContact(String contactId,Context context) {if (context == null || contactId == null) {return ;}Uri uri = getContactUri(contactId,context);if (uri != null) {Intent editIntent = new Intent(Intent.ACTION_EDIT);editIntent.setDataAndType(uri,ContactsContract.Contacts.CONTENT_ITEM_TYPE);// editIntent.putExtra("finishActivityOnSaveCompleted", true);context.startActivity(editIntent);} else {}}/*** 修改联系⼈信息* */public void updateContact(Contact contactOld, Contact contactNew) {Log.w(TAG, "**update start**");String id = getContactID(contactOld.getName());if(id.equals("0")) {Log.d(TAG, contactOld.getName()+" not exist.");}/* else if(contactNew.getName().trim().equals("")){Log.d(TAG, "contact name is empty. exit.");} else if(!getContactID(contactNew.getName()).equals("0")){Log.d(TAG, "new contact name already exist. exit.");}*/else {ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();//update name// ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)// .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?", // new String[]{id, MIMETYPE_STRING_NAME})// .withValue(COLUMN_NAME, contactNew.getName())// .build());Log.d(TAG, "update name: " + contactNew.getName());// photoops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?", new String[]{id, MIMETYPE_STRING_PHOTO}).withValue(COLUMN_PHOTO, contactNew.getPhotoData()).build());// webops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?", new String[]{id, MIMETYPE_STRING_WEB}).withValue(COLUMN_WEB,contactNew.getHomePage()).withValue(COLUMN_WEB_TYPE, contactNew.getHomePage()).build());// postalops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?", new String[]{id, MIMETYPE_STRING_ADDRESS}).withValue(COLUMN_POSTAL,contactNew.getAddress()).withValue(COLUMN_POSTAL_TYPE, contactNew.getAddressType()).build());//update number//update numberif(!contactNew.getNumber().trim().equals("")) {ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=? AND " + COLUMN_NUMBER_TYPE + "=?", new String[]{id, MIMETYPE_STRING_PHONE,contactNew.getNumberType()}).withValue(COLUMN_NUMBER, contactNew.getNumber()).withValue(COLUMN_NUMBER_TYPE, contactNew.getNumberType()).build());Log.d(TAG, "update number: " + contactNew.getNumber());}// faxif(!contactNew.getNumber().trim().equals("")) {ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=? AND " + COLUMN_NUMBER_TYPE + "=?", new String[]{id, MIMETYPE_STRING_PHONE,contactNew.getFaxType()}).withValue(COLUMN_NUMBER, contactNew.getFax()).withValue(COLUMN_NUMBER_TYPE, contactNew.getFaxType()).build());Log.d(TAG, "update fax: " + contactNew.getNumber());}//update email if mailif(!contactNew.getEmail().trim().equals("")) {ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?",new String[]{id, MIMETYPE_STRING_EMAIL}).withValue(COLUMN_EMAIL, contactNew.getEmail()).withValue(COLUMN_EMAIL_TYPE, contactNew.getEmailType()).build());Log.d(TAG, "update email: " + contactNew.getEmail());}try {contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);Log.d(TAG, "update success");} catch (Exception e) {Log.d(TAG, "update failed");Log.e(TAG, e.getMessage());}}Log.w(TAG, "**update end**");}。

手机通讯录安卓课程设计

手机通讯录安卓课程设计

手机通讯录安卓课程设计1. 选题背景随着移动智能终端的普及,手机通讯录成为人们日常生活中必不可少的功能之一。

在这个背景下,本课程设计选择开发一个基于安卓平台的手机通讯录应用程序。

2. 课程设计目标通过本课程设计,学生将能够掌握以下技能:•掌握安卓应用程序开发的基本流程和技术•熟悉手机通讯录应用程序的功能和实现方式•能够使用Java语言编写安卓应用程序•能够使用Android Studio开发工具进行安卓应用程序的开发和调试3. 课程设计内容3.1 基本功能实现本课程设计的手机通讯录应用程序需要实现以下基本功能:•添加联系人•删除联系人•修改联系人信息•显示联系人列表•根据姓名或电话号码搜索联系人•拨打电话或发送短信3.2 扩展功能实现为了提高应用程序的实用性和扩展性,本课程设计还需要实现以下扩展功能:•显示联系人头像•同步联系人数据到云端或服务器•分组管理联系人•自定义联系人信息字段3.3 课程设计步骤本课程设计的实验步骤如下:1.环境搭建:学生需要安装Java开发环境和Android Studio开发工具,并配置好相关环境变量和SDK版本。

2.项目创建:学生需要创建一个新的安卓项目,并设置好项目的基本参数和开发环境。

3.页面设计:学生按照设计要求,设计应用程序的主界面和子界面,并添加相应的控件。

4.数据库设计:学生需要设计和创建联系人数据库,并编写相关的CRUD操作方法。

5.功能实现:学生需要编写相应的Java代码,实现联系人管理功能的实现。

6.调试测试:学生需要使用Android Studio工具对编写好的代码进行调试和测试,确保应用程序的稳定性和可靠性。

7.导出发布:学生需要将应用程序打包成APK文件,并发布到应用商店或其他渠道。

4. 课程设计评价学生的课程成绩将综合考虑以下方面:•功能实现的完整性和准确性•页面设计的美观性和用户体验•代码的编写规范和可读性•调试和测试的实用性和有效性•实验报告的详尽和清晰程度5.本课程设计旨在培养学生的安卓开发能力和实际编程经验,通过设计实现一个手机通讯录应用程序,让学生初步掌握安卓应用程序的开发流程和技术,并锻炼学生的编程思维和实际应用能力。

Android中通讯录 自定义布局显示 数据库中的 用户名和电话号码

Android中通讯录 自定义布局显示 数据库中的 用户名和电话号码
return persons.get(position); } //返回条目所在的位置 @Override public long getItemId(int position) {
return position; }
@Override public View getView(int position, View convertView, ViewGroup parent) {
@Override public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//获取每个条目显示的对象 Person p = (Person) parent.getItemAtPosition(position); Toast.makeText(getApplicationContext(), p.getName()+"-"+p.getP }
});
1
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }

Android中通讯录 自定义布局显示 数据库中的 用户名和电话号码
请联合前几篇文章来看本代码:
/** * * @author chrp * *自定义布局显示 数据库中的 用户名和电话号码 */
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

android自定义View之Android手机通讯录制作我们的手机通讯录一般都有这样的效果,如下图:OK,这种效果大家都见得多了,基本上所有的Android手机通讯录都有这样的效果。

那我们今天就来看看这个效果该怎么实现。

一.概述1.页面功能分析整体上来说,左边是一个ListView,右边是一个自定义View,但是左边的ListView 和我们平常使用的ListView还有一点点不同,就是在ListView中我对所有的联系人进行了分组,那么这种效果的实现最常见的就是两种思路:1.使用ExpandableListView来实现这种分组效果2.使用普通ListView,在构造Adapter时实现SectionIndexer接口,然后在Adapter 中做相应的处理这两种方式都不难,都属于普通控件的使用,那么这里我们使用第二种方式来实现,第一种方式的实现方法大家可以自行研究,如果你还不熟悉ExpandableListView的使用,可以参考我的另外两篇博客:1.使用ExpandableListView实现一个时光轴2.android开发之ExpandableListView的使用,实现类似QQ好友列表OK,这是我们左边ListView的实现思路,右边这个东东就是我们今天的主角,这里我通过自定义一个View来实现,View中的A、B......#这些字符我都通过canvas的drawText 方法绘制上去。

然后重写onTouchEvent方法来实现事件监听。

2.要实现的效果要实现的效果如上图所示,但是大家看图片有些地方可能还不太清楚,所以这里我再强调一下:1.左边的ListView对数据进行分组显示2.当左边ListView滑动的时候,右边滑动控件中的文字颜色能够跟随左边ListView 的滑动自动变化3.当手指在右边的滑动控件上滑动时,手指滑动到的地方的文字颜色应当发生变化,同时在整个页面的正中央有一个TextView显示手指目前按下的文字4.当手指按下右边的滑动控件时,右边的滑动控件背景变为灰色,手指松开后,右边的滑动控件又变为透明色二.左边ListView分组效果的实现无论多大的工程,我们都要将之分解为一个个细小的功能块分步来实现,那么这里我们就先来看看左边的ListView的分组的实现,这个效果实现之后,我们再来看看右边的滑动控件该怎么实现。

首先我需要在布局文件中添加一个ListView,这个很简单,和普通的ListView一模一样,我就不贴代码了,另外,针对ListView中的数据集,我需要自建一个实体类,该实体类如下:/*** Created by wangsong on 2016/4/24.*/public class User {private intimg;private String username;private String pinyin;private String firstLetter;public User() {}public String getFirstLetter() {return firstLetter;}public void setFirstLetter(String firstLetter) { this.firstLetter = firstLetter;}public intgetImg() {return img;}public void setImg(intimg) {this.img = img;}public String getPinyin() {return pinyin;public void setPinyin(String pinyin) {this.pinyin = pinyin;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public User(String firstLetter, intimg, String pinyin, String username) { this.firstLetter = firstLetter;this.img = img;this.pinyin = pinyin;ername = username;}username 用来存储用户名,img表示用户图像的资源id(这里我没有准备相应的图片,大家有兴趣可以自行添加),pinyin表示用户姓名的拼音,firstLetter表示用户姓名拼音的首字母,OK ,就这么简单的几个属性。

至于数据源,我在strings.xml文件中添加了许多数据,这里就不贴出来了,大家可以直接在文末下载源码看。

知道了数据源,知道了实体类,我们来看看在MainActivity中怎么样来初始化数据:private void initData() {list = new ArrayList<>();String[] allUserNames = getResources().getStringArray(R.array.arrUsernames);for (String allUserName :allUserNames) {User user = new User();user.setUsername(allUserName);String convert =ChineseToPinyinHelper.getInstance().getPinyin(allUserName).toUpperCase();user.setPinyin(convert);String substring = convert.substring(0, 1);if (substring.matches("[A-Z]")) {user.setFirstLetter(substring);user.setFirstLetter("#");}list.add(user);}Collections.sort(list, new Comparator<User>() {@Overridepublic intcompare(User lhs, User rhs) {if (lhs.getFirstLetter().contains("#")) {return 1;} else if (rhs.getFirstLetter().contains("#")) { return -1;}else{returnlhs.getFirstLetter().compareTo(rhs.getFirstLetter());}}});}首先创建一个List集合用来存放所有的数据,然后从strings.xml文件中读取出来所有的数据,遍历数据然后存储到List集合中,在遍历的过程中,我通过ChineseToPinyinHelper 这个工具类来将中文转为拼音,然后截取拼音的第一个字母,如果该字母是A~Z,那么直接设置给 user对象的firstLetter属性,否则user对象的firstLetter属性为一个#,这是由于我的数据源中有一些不是以汉字开头的姓名,而是以其他字符开头的姓名,那么我将这些统一归为#这个分组。

OK,数据源构造好之后,我还需要对List集合进行一个简单的排序,那么这个排序是Java中的操作,我这里就不再赘述。

构造完数据源之后,接着就该是构造ListView的Adapter了,我们来看看这个怎么做,先来看看源码:/*** Created by wangsong on 2016/4/24.*/public class MyAdapter extends BaseAdapter implements SectionIndexer {private List<User> list;private Context context;private LayoutInflaterinflater;public MyAdapter(Context context, List<User> list) {this.context = context;this.list = list;inflater = LayoutInflater.from(context); }@Overridepublic intgetCount() {return list.size();}@Overridepublic Object getItem(int position) { return list.get(position);}@Overridepublic long getItemId(int position) { return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder;if (convertView == null) {convertView = inflater.inflate(yout.listview_item, null);holder = new ViewHolder();holder.showLetter = (TextView) convertView.findViewById(R.id.show_letter); ername = (TextView) convertView.findViewById(ername); convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}User user = list.get(position);ername.setText(user.getUsername());//获得当前position是属于哪个分组intsectionForPosition = getSectionForPosition(position);//获得该分组第一项的positionintpositionForSection = getPositionForSection(sectionForPosition);//查看当前position是不是当前item所在分组的第一个item//如果是,则显示showLetter,否则隐藏if (position == positionForSection) {holder.showLetter.setVisibility(View.VISIBLE);holder.showLetter.setText(user.getFirstLetter());} else {holder.showLetter.setVisibility(View.GONE);}return convertView;}@Overridepublic Object[] getSections() {return new Object[0];}//传入一个分组值[A....Z],获得该分组的第一项的position@Overridepublic intgetPositionForSection(intsectionIndex) {for (inti = 0; i<list.size(); i++) {if (list.get(i).getFirstLetter().charAt(0) == sectionIndex) {return i;}}return -1;}//传入一个position,获得该position所在的分组@Overridepublic intgetSectionForPosition(int position) {return list.get(position).getFirstLetter().charAt(0);}class ViewHolder {TextView username, showLetter;}}这个Adapter大部分还是和我们之前的Adapter一样的,只不过这里实现了SectionIndexer接口,实现了这个接口,我们就要实现该接口中的三个方法,分别是getSections(),getPositionForSection(),getSectionForPosition()这三个方法,我们这里用到的主要是后面这两个方法,那我来详细说一下:1.getPositionForSection(intsectionIndex)这个方法接收一个int类型的参数,该参数实际上就是指我们的分组,我们在这里传入分组的值【A.....Z】,然后我们在方法中通过自己的计算,返回该分组中第一个item的position。

相关文档
最新文档