Android开发之中的一个个简单的通讯录实现(源代码)
通讯录就是一个ListView。我们须要通过数据库和ContentProvider来活动通讯录的数据。当然,我们应该提供选中后编辑的功能。
非常easy的一个通讯略Demo,所以。直接上代码,须要的看一下就知道。
不解释。
文件1: MyContacs
主活动页面。
package com.yarin.android.MyContacts; import android.app.ListActivity;
import android.content.ComponentName;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter; public class MyContacts extends ListActivity{
private static final int AddContact_ID = Menu.FIRST;
//private static final int EditContact_ID = Menu.FIRST+1;
private static final int DELEContact_ID = Menu.FIRST+2;
private static final int EXITContact_ID = Menu.FIRST+3; public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT); Intent intent = getIntent();
if (intent.getData() == null) {
intent.setData(ContactsProvider.CONTENT_URI);
} getListView().setOnCreateContextMenuListener(this); Cursor cursor = managedQuery(getIntent().getData(), ContactColumn.PROJECTION, null, null,null); //注冊每一个列表表示形式 :姓名 + 移动电话
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_2,
cursor,
new String[] {ContactColumn.NAME, ContactColumn.MOBILENUM },
new int[] { android.R.id.text1, android.R.id.text2 }); setListAdapter(adapter);
} public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
//加入联系人
menu.add(0, AddContact_ID, 0, R.string.add_user)
.setShortcut('3', 'a')
.setIcon(R.drawable.add); Intent intent = new Intent(null, getIntent().getData());
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,
new ComponentName(this, MyContacts.class), null, intent, 0, null); //退出程序
menu.add(0, EXITContact_ID, 0, R.string.exit)
.setShortcut('4', 'd')
.setIcon(R.drawable.exit);
return true; } //处理菜单操作
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case AddContact_ID:
//加入联系人
startActivity(new Intent(Intent.ACTION_INSERT, getIntent().getData()));
return true;
case EXITContact_ID:
//退出程序
this.finish();
return true;
}
return super.onOptionsItemSelected(item);
} public boolean onPrepareOptionsMenu(Menu menu)
{
super.onPrepareOptionsMenu(menu);
final boolean haveItems = getListAdapter().getCount() > 0; if (haveItems)
{ Uri uri = ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId()); Intent[] specifics = new Intent[2];
specifics[0] = new Intent(Intent.ACTION_EDIT, uri);
specifics[1] = new Intent(Intent.ACTION_VIEW, uri);
MenuItem[] items = new MenuItem[2]; //加入满足条件的菜单
Intent intent = new Intent(null, uri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, specifics, intent, 0, items); if (items[0] != null)
{
//编辑联系人
items[0].setShortcut('1', 'e').setIcon(R.drawable.edituser).setTitle(R.string.editor_user);
}
if (items[1] != null)
{
//查看联系人
items[1].setShortcut('2', 'f').setTitle(R.string.view_user).setIcon(R.drawable.viewuser);
}
}
else
{
menu.removeGroup(Menu.CATEGORY_ALTERNATIVE);
}
return true;
}
//动态菜单处理
//点击的默认操作也能够在这里处理
protected void onListItemClick(ListView l, View v, int position, long id)
{
Uri uri = ContentUris.withAppendedId(getIntent().getData(), id); String action = getIntent().getAction();
if ( Intent.ACTION_EDIT.equals(action) )
{
//编辑联系人
startActivity(new Intent(Intent.ACTION_EDIT, uri));
}
else
{
//查看联系人
startActivity(new Intent(Intent.ACTION_VIEW, uri));
}
} //长按触发的菜单
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo)
{
AdapterView.AdapterContextMenuInfo info;
try
{
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
}
catch (ClassCastException e)
{
return;
}
//得到长按的数据项
Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
if (cursor == null)
{
return;
} menu.setHeaderTitle(cursor.getString(1));
//加入删除菜单
menu.add(0, DELEContact_ID, 0, R.string.delete_user);
} @Override
public boolean onContextItemSelected(MenuItem item){
AdapterView.AdapterContextMenuInfo info;
try{
info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
}catch (ClassCastException e){
return false;
} switch (item.getItemId()){
case DELEContact_ID:{
//删除一条记录
Uri noteUri = ContentUris.withAppendedId(getIntent().getData(), info.id);
getContentResolver().delete(noteUri, null, null);
return true;
}
}
return false;
}
}
文件2 DBHelper
数据库相关操作。
package com.yarin.android.MyContacts; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper
{
public static final String DATABASE_NAME = "mycontacts.db";//数据库名
public static final int DATABASE_VERSION = 2; //版本号
public static final String CONTACTS_TABLE = "contacts"; //表名
//创建表
private static final String DATABASE_CREATE =
"CREATE TABLE " + CONTACTS_TABLE +" ("
+ ContactColumn._ID+" integer primary key autoincrement,"
+ ContactColumn.NAME+" text,"
+ ContactColumn.MOBILENUM+" text,"
+ ContactColumn.HOMENUM+" text,"
+ ContactColumn.ADDRESS+" text,"
+ ContactColumn.EMAIL+" text,"
+ ContactColumn.BLOG+" text);";
public DBHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE);
onCreate(db);
}
}
文件3 ContentsProvider
内容提供
package com.yarin.android.MyContacts; import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils; public class ContactsProvider extends ContentProvider{
private DBHelper dbHelper;
private SQLiteDatabase contactsDB; public static final String AUTHORITY = "com.yarin.android.provider.ContactsProvider";
public static final String CONTACTS_TABLE = "contacts";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"+CONTACTS_TABLE); /*=====================================================*/
//以下是自己定义的类型
public static final int CONTACTS = 1;
public static final int CONTACT_ID = 2;
private static final UriMatcher uriMatcher;
static
{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY,"contacts",CONTACTS);
//单独列
uriMatcher.addURI(AUTHORITY,"contacts/#",CONTACT_ID);
}
/*=====================================================*/ @Override
public boolean onCreate()
{
dbHelper = new DBHelper(getContext());
//运行创建数据库
contactsDB = dbHelper.getWritableDatabase();
return (contactsDB == null) ? false : true;
} // 删除指定数据列
@Override
public int delete(Uri uri, String where, String[] selectionArgs)
{
int count;
switch (uriMatcher.match(uri))
{
case CONTACTS:
count = contactsDB.delete(CONTACTS_TABLE, where, selectionArgs);
break;
case CONTACT_ID:
String contactID = uri.getPathSegments().get(1);
count = contactsDB.delete(CONTACTS_TABLE,
ContactColumn._ID
+ "=" + contactID
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ")" : ""),
selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
} // URI类型转换
public String getType(Uri uri)
{
switch (uriMatcher.match(uri))
{
case CONTACTS:
return "vnd.android.cursor.dir/vnd.yarin.android.mycontacts";
case CONTACT_ID:
return "vnd.android.cursor.item/vnd.yarin.android.mycontacts";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
} // 插入数据
public Uri insert(Uri uri, ContentValues initialValues)
{
if (uriMatcher.match(uri) != CONTACTS)
{
throw new IllegalArgumentException("Unknown URI " + uri);
}
ContentValues values;
if (initialValues != null)
{
values = new ContentValues(initialValues);
}
else
{
values = new ContentValues();
}
// 设置默认值
if (values.containsKey(ContactColumn.NAME) == false)
{
values.put(ContactColumn.NAME, "");
}
if (values.containsKey(ContactColumn.MOBILENUM) == false)
{
values.put(ContactColumn.MOBILENUM, "");
}
if (values.containsKey(ContactColumn.HOMENUM) == false)
{
values.put(ContactColumn.HOMENUM, "");
}
if (values.containsKey(ContactColumn.ADDRESS) == false)
{
values.put(ContactColumn.ADDRESS, "");
}
if (values.containsKey(ContactColumn.EMAIL) == false)
{
values.put(ContactColumn.EMAIL, "");
}
if (values.containsKey(ContactColumn.BLOG) == false)
{
values.put(ContactColumn.BLOG, "");
}
long rowId = contactsDB.insert(CONTACTS_TABLE, null, values);
if (rowId > 0)
{
Uri noteUri = ContentUris.withAppendedId(CONTENT_URI, rowId);
getContext().getContentResolver().notifyChange(noteUri, null);
return noteUri;
}
throw new SQLException("Failed to insert row into " + uri);
} // 查询数据
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(CONTACTS_TABLE); switch (uriMatcher.match(uri))
{
case CONTACT_ID:
qb.appendWhere(ContactColumn._ID + "=" + uri.getPathSegments().get(1));
break;
default:
break;
}
String orderBy;
if (TextUtils.isEmpty(sortOrder))
{
orderBy = ContactColumn._ID;
}
else
{
orderBy = sortOrder;
}
Cursor c = qb.query(contactsDB, projection, selection, selectionArgs, null, null, orderBy);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
} // 更新数据库
public int update(Uri uri, ContentValues values, String where, String[] selectionArgs)
{
int count;
switch (uriMatcher.match(uri))
{
case CONTACTS:
count = contactsDB.update(CONTACTS_TABLE, values, where, selectionArgs);
break;
case CONTACT_ID:
String contactID = uri.getPathSegments().get(1);
count = contactsDB.update(CONTACTS_TABLE, values, ContactColumn._ID + "=" + contactID
+ (!TextUtils.isEmpty(where) ? " AND (" + where + ")" : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
文件4 ContactView
package com.yarin.android.MyContacts; import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView; public class ContactView extends Activity
{
private TextView mTextViewName;
private TextView mTextViewMobile;
private TextView mTextViewHome;
private TextView mTextViewAddress;
private TextView mTextViewEmail;
private TextView mTextViewBlog; private Cursor mCursor;
private Uri mUri; private static final int REVERT_ID = Menu.FIRST;
private static final int DELETE_ID = Menu.FIRST + 1;
private static final int EDITOR_ID = Menu.FIRST + 2;
private static final int CALL_ID = Menu.FIRST + 3;
private static final int SENDSMS_ID = Menu.FIRST + 4; public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState); mUri = getIntent().getData(); this.setContentView(R.layout.viewuser); mTextViewName = (TextView) findViewById(R.id.TextView_Name);
mTextViewMobile = (TextView) findViewById(R.id.TextView_Mobile);
mTextViewHome = (TextView) findViewById(R.id.TextView_Home);
mTextViewAddress = (TextView) findViewById(R.id.TextView_Address);
mTextViewEmail = (TextView) findViewById(R.id.TextView_Email);
mTextViewBlog = (TextView) findViewById(R.id.TextView_Blog); // 获得并保存原始联系人信息
mCursor = managedQuery(mUri, ContactColumn.PROJECTION, null, null, null);
mCursor.moveToFirst();
} protected void onResume()
{
super.onResume();
if (mCursor != null)
{
// 读取并显示联系人信息
mCursor.moveToFirst(); mTextViewName.setText(mCursor.getString(ContactColumn.NAME_COLUMN));
mTextViewMobile.setText(mCursor.getString(ContactColumn.MOBILENUM_COLUMN));
mTextViewHome.setText(mCursor.getString(ContactColumn.HOMENUM_COLUMN));
mTextViewAddress.setText(mCursor.getString(ContactColumn.ADDRESS_COLUMN));
mTextViewEmail.setText(mCursor.getString(ContactColumn.EMAIL_COLUMN));
mTextViewBlog.setText(mCursor.getString(ContactColumn.BLOG_COLUMN));
}
else
{
setTitle("错误信息");
}
} public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
//加入菜单
menu.add(0, REVERT_ID, 0, R.string.revert).setShortcut('0', 'r').setIcon(R.drawable.listuser);
menu.add(0, DELETE_ID, 0, R.string.delete_user).setShortcut('0', 'd').setIcon(R.drawable.remove);
menu.add(0, EDITOR_ID, 0, R.string.editor_user).setShortcut('0', 'd').setIcon(R.drawable.edituser);
menu.add(0, CALL_ID, 0, R.string.call_user).setShortcut('0', 'd').setIcon(R.drawable.calluser)
.setTitle(this.getResources().getString(R.string.call_user));
menu.add(0, SENDSMS_ID, 0, R.string.sendsms_user).setShortcut('0', 'd').setIcon(R.drawable.sendsms)
.setTitle(this.getResources().getString(R.string.sendsms_user));
return true;
} public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
//删除
case DELETE_ID:
deleteContact();
finish();
break;
//返回列表
case REVERT_ID:
setResult(RESULT_CANCELED);
finish();
break;
case EDITOR_ID:
//编辑联系人
startActivity(new Intent(Intent.ACTION_EDIT, mUri));
break;
case CALL_ID:
//呼叫联系人
Intent call = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+mTextViewMobile.getText()));
startActivity(call);
break;
case SENDSMS_ID:
//发短信给联系人
Intent sms = new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto:"+mTextViewMobile.getText()));
startActivity(sms);
break;
}
return super.onOptionsItemSelected(item);
} // 删除联系人信息
private void deleteContact()
{
if (mCursor != null)
{
mCursor.close();
mCursor = null;
getContentResolver().delete(mUri, null, null);
setResult(RESULT_CANCELED);
}
}
}
文件5 ContactColumn
数据表定义
package com.yarin.android.MyContacts; import android.provider.BaseColumns; //定义数据
public class ContactColumn implements BaseColumns{
public ContactColumn(){}
//列名
public static final String NAME = "name"; //姓名
public static final String MOBILENUM = "mobileNumber";//移动电话
public static final String HOMENUM = "homeNumber"; //家庭电话
public static final String ADDRESS = "address"; //地址
public static final String EMAIL = "email"; //邮箱
public static final String BLOG = "blog"; //博客
//列 索引值
public static final int _ID_COLUMN = 0;
public static final int NAME_COLUMN = 1;
public static final int MOBILENUM_COLUMN = 2;
public static final int HOMENUM_COLUMN = 3;
public static final int ADDRESS_COLUMN = 4;
public static final int EMAIL_COLUMN = 5;
public static final int BLOG_COLUMN = 6; //查询结果
public static final String[] PROJECTION ={
_ID,
NAME,
MOBILENUM,
HOMENUM,
ADDRESS,
EMAIL,
BLOG,
};
}
文件6
编辑状态下的页面
package com.yarin.android.MyContacts; import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class ContactEditor extends Activity{ private static final int STATE_EDIT = 0;
private static final int STATE_INSERT = 1; private static final int REVERT_ID = Menu.FIRST;
private static final int DISCARD_ID = Menu.FIRST + 1;
private static final int DELETE_ID = Menu.FIRST + 2; private Cursor mCursor;
private int mState;
private Uri mUri;
private EditText nameText;
private EditText mobileText;
private EditText homeText;
private EditText addressText;
private EditText emailText;
private EditText blogText; private Button okButton;
private Button cancelButton; public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState); final Intent intent = getIntent();
final String action = intent.getAction();
//依据action的不同进行不同的操作
//编辑联系人
if (Intent.ACTION_EDIT.equals(action))
{
mState = STATE_EDIT;
mUri = intent.getData();
}
else if (Intent.ACTION_INSERT.equals(action))
{
//加入新联系人
mState = STATE_INSERT;
mUri = getContentResolver().insert(intent.getData(), null); if (mUri == null)
{
finish();
return;
}
setResult(RESULT_OK, (new Intent()).setAction(mUri.toString())); }
else
{
finish();
return;
} setContentView(R.layout.editorcontacts); nameText = (EditText) findViewById(R.id.EditText01);
mobileText = (EditText) findViewById(R.id.EditText02);
homeText = (EditText) findViewById(R.id.EditText03);
addressText = (EditText) findViewById(R.id.EditText04);
emailText = (EditText) findViewById(R.id.EditText05);
blogText = (EditText) findViewById(R.id.EditText06); okButton = (Button)findViewById(R.id.Button01);
cancelButton = (Button)findViewById(R.id.Button02); okButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
String text = nameText.getText().toString();
if(text.length()==0)
{
//假设没有输入东西。则不加入记录
setResult(RESULT_CANCELED);
deleteContact();
finish();
}
else
{
//加入一条数据
updateContact();
}
} });
cancelButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
if(mState == STATE_INSERT)
{
//不加入记录
setResult(RESULT_CANCELED);
deleteContact();
finish();
}
else
{
//恢复到编辑前的状态
backupContact();
}
}
}); // 获得并保存原始联系人信息
mCursor = managedQuery(mUri, ContactColumn.PROJECTION, null, null, null);
mCursor.moveToFirst();
} protected void onResume()
{
super.onResume();
if (mCursor != null)
{
// 读取并显示联系人信息
mCursor.moveToFirst();
if (mState == STATE_EDIT)
{
setTitle(getText(R.string.editor_user));
}
else if (mState == STATE_INSERT)
{
setTitle(getText(R.string.add_user));
}
String name = mCursor.getString(ContactColumn.NAME_COLUMN);
String moblie = mCursor.getString(ContactColumn.MOBILENUM_COLUMN);
String home = mCursor.getString(ContactColumn.HOMENUM_COLUMN);
String address = mCursor.getString(ContactColumn.ADDRESS_COLUMN);
String email = mCursor.getString(ContactColumn.EMAIL_COLUMN);
String blog = mCursor.getString(ContactColumn.BLOG_COLUMN); nameText.setText(name);
mobileText.setText(moblie);
homeText.setText(home);
addressText.setText(address);
emailText.setText(email);
blogText.setText(blog);
}
else
{
setTitle("错误信息");
}
} protected void onPause()
{
super.onPause();
if (mCursor != null)
{
String text = nameText.getText().toString();
if (text.length() == 0)
{
setResult(RESULT_CANCELED);
deleteContact();
// 更新信息
}
else
{
ContentValues values = new ContentValues();
values.put(ContactColumn.NAME, nameText.getText().toString());
values.put(ContactColumn.MOBILENUM, mobileText.getText().toString());
values.put(ContactColumn.HOMENUM, homeText.getText().toString());
values.put(ContactColumn.ADDRESS, addressText.getText().toString());
values.put(ContactColumn.EMAIL, emailText.getText().toString());
values.put(ContactColumn.BLOG, blogText.getText().toString()); getContentResolver().update(mUri, values, null, null);
}
}
} public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu); if (mState == STATE_EDIT)
{
menu.add(0, REVERT_ID, 0, R.string.revert)
.setShortcut('0', 'r')
.setIcon(R.drawable.listuser);
menu.add(0, DELETE_ID, 0, R.string.delete_user)
.setShortcut('0', 'f')
.setIcon(R.drawable.remove);
}
else
{
menu.add(0, DISCARD_ID, 0, R.string.revert)
.setShortcut('0', 'd')
.setIcon(R.drawable.listuser);
}
return true;
}
//菜单处理
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case DELETE_ID:
deleteContact();
finish();
break;
case DISCARD_ID:
cancelContact();
break;
case REVERT_ID:
backupContact();
break;
}
return super.onOptionsItemSelected(item);
} //删除联系人信息
private void deleteContact()
{
if (mCursor != null)
{
mCursor.close();
mCursor = null;
getContentResolver().delete(mUri, null, null);
nameText.setText("");
}
}
//丢弃信息
private void cancelContact()
{
if (mCursor != null)
{
deleteContact();
}
setResult(RESULT_CANCELED);
finish();
}
//更新 变更的信息
private void updateContact()
{
if (mCursor != null)
{
mCursor.close();
mCursor = null;
ContentValues values = new ContentValues();
values.put(ContactColumn.NAME, nameText.getText().toString());
values.put(ContactColumn.MOBILENUM, mobileText.getText().toString());
values.put(ContactColumn.HOMENUM, homeText.getText().toString());
values.put(ContactColumn.ADDRESS, addressText.getText().toString());
values.put(ContactColumn.EMAIL, emailText.getText().toString());
values.put(ContactColumn.BLOG, blogText.getText().toString());
getContentResolver().update(mUri, values, null, null);
}
setResult(RESULT_CANCELED);
finish();
}
//取消用,回退到最初的信息
private void backupContact()
{
if (mCursor != null)
{
mCursor.close();
mCursor = null;
ContentValues values = new ContentValues();
values.put(ContactColumn.NAME, nameText.getText().toString());
values.put(ContactColumn.MOBILENUM, mobileText.getText().toString());
values.put(ContactColumn.HOMENUM, homeText.getText().toString());
values.put(ContactColumn.ADDRESS, addressText.getText().toString());
values.put(ContactColumn.EMAIL, emailText.getText().toString());
values.put(ContactColumn.BLOG, blogText.getText().toString());
getContentResolver().update(mUri, values, null, null);
}
setResult(RESULT_CANCELED);
finish();
}
}
Android开发之中的一个个简单的通讯录实现(源代码)的更多相关文章
- 黑客破译android开发代码真就那么简单?
很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了 ...
- Android开发技巧——PagerAdapter的再次简单封装
这次再对内容为View的ViewPager的适配器PagerAdapter进行简单的封装,支持List数据和SparseArray的数据,带更新视图功能. 首先,先贴上最上面的抽象类代码: /* * ...
- Android开发之百度地图的简单使用
越来越多的App运用到了定位,导航的这些功能,其实实现一个自己的百度地图也是非常的简单,这篇博客将会教你简单的实现一个百度地图.看一下效果图: 第一步:要使用百度地图,必须要有百度地图的Key,要获得 ...
- android 开发 View _4_ 我的简单自定义ViewDemo
效果图: 代码: package com.example.lenovo.mydemo.myViewDemo; import android.content.Context; import androi ...
- Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)
导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了 ...
- Android开发环境下关于如何导出手机通讯录数据库【Written By KillerLegend】
首先度Linux中的权限(Permissions)进行一些说明: permissions一共有10个符号位,[- --- --- ---],在这里我们从左至右由0开始编号,各个符号位的编号分别为0,1 ...
- Android开发之自定义Spinner样式的效果实现(源代码实现)
android系统自带的Spinner样式是远远满足不了我们实际开发过程中对Spinner UI风格的要求,因此我们肯定需要为了切合整个应用的风格,修改我们的Spinner样式.系统给我们提供了两种常 ...
- Android开发:第四日——SQLite初接触
一.SQLite 介绍 SQLite一个非常流行的轻量级嵌入式数据库,SQLite支持多数的SQL92标准,在一些场合下其性能优于MySql等数据库引擎,并且只利用很少的内存就有很好的性能.此外它还是 ...
- android驱动[置顶] 我的DIY Android之旅--驱动并控制你的Android开发板蜂鸣器
改章节个人在深圳游玩的时候突然想到的...这几周就有想写几篇关于android驱动的博客,所以回家到之后就奋笔疾书的写出来发布了 这些天一直在想Android驱动框架层的实现,本文借助老罗教师的博客和 ...
随机推荐
- 【总集】C++ STL类库 vector 使用方法
介绍: 1.vector 的中文名为向量,可以理解为一个序列容器,里面存放的是相同的数据结构类型,类似于数组但与数组又有微妙的不同. 2.vector 采用的是连续动态的空间来存储数据,它是动态的数组 ...
- Leetcode 378.有序矩阵中第k小的元素
有序矩阵中第k小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, ...
- POJ 1971-Parallelogram Counting,暴力1063ms!
Parallelogram Counting 刚学hash还不会用,看到5000ms的时限于是想着暴力来一发应该可以过.以前做过类似的题,求平行四边形个数,好像是在CF上做的,但忘了时限是多少了,方法 ...
- mysql5.7.20搭建
官网mysql下载源码安装 下载MySQL5.7.20源码包,wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20.tar.g ...
- leetcode 376
利用贪心思想,每次都得到到当前数最长的长度,和与当前数链接的前一个数之间差的符号 class Solution { public: int wiggleMaxLength(vector<int& ...
- asp.net 错误 类型"xxxxx"同时存在于"xxx.dll"和"xxxx.dll" 中
http://walttoney.blog.163.com/blog/static/127685797201051112839328/错误 类型“System.Web.UI.ScriptManager ...
- msp430项目编程56
msp430综合项目---扩展项目六56 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结
- Spring 定时器 定时访问数据库并发送邮件
我这里有两个案例的方法: 第一种:使用Spring quartz: 我这里使用的jar:spring-context-support.jar.quartz-1.6.5.jar ============ ...
- 通过Nginx 的反向代理来加强kibana的访问安全
https://blog.csdn.net/choelea/article/details/57406086
- 发布npm包
来源:https://segmentfault.com/a/1190000010398983