Android實現(xiàn)可瀏覽和搜索的聯(lián)系人列表
通過這篇文章,我想說明一下如何創(chuàng)建一個可搜索的“聯(lián)系人列表”Android應用程序。使用這個應用程序,用戶可以通過使用導航按鈕瀏覽所有保存的聯(lián)系人和根據(jù)聯(lián)系人名稱搜索聯(lián)系人。該應用程序還可以顯示聯(lián)系人的照片(如果可用)。
要瀏覽聯(lián)系人列表可以使用<<,<,>和>>按鈕。
要搜索聯(lián)系人的用戶在“搜索名稱”文本框中鍵入聯(lián)系人名稱,然后單擊“搜索”按鈕。點擊“清除搜索”按鈕,清除“搜索名稱”文本框中,并顯示開始搜索前,最后一次查看的聯(lián)系人。
由于該應用從設備讀取聯(lián)系人,以下條目需要在AndroidManifest.xml文件,以允許權(quán)限應用讀取聯(lián)系人:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
下面的代碼創(chuàng)建一個表格布局顯示聯(lián)系人:
<TableLayout xmlns:android="<a rel="nofollow" target="_blank">http://schemas.android.com/apk/res/android"</a> android:layout_height="match_parent" android:layout_width="350dp"> <TableRow> <TextView android:id="@+id/txtId" android:width="175dp" android:text="Contact Id: "/> <TextView android:id="@+id/txtIdVal" android:width="175dp"/> </TableRow> <TableRow> <TextView android:id="@+id/txtDisplayName" android:width="175dp" android:text="Contact Name: "/> <TextView android:id="@+id/txtDisplayNameVal" android:width="175dp"/> </TableRow> <TableRow> <TextView android:id="@+id/txtPhoneNo" android:width="175dp" android:text="Phone Number: "/> <TextView android:id="@+id/txtPhoneNoVal" android:width="175dp"/> </TableRow> <TableRow> <TextView android:id="@+id/txtPhoto" android:width="175dp" android:text="Photo: "/> <ImageView android:id="@+id/imgPhoto" android:width="175dp"/> </TableRow> <TableRow> <Button android:id="@+id/btnFirst" android:width="175dp" android:text="<<" android:onClick="first"/> <Button android:id="@+id/btnPrevious" android:width="175dp" android:text="<" android:onClick="previous"/> </TableRow> <TableRow> <Button android:id="@+id/btnNext" android:width="175dp" android:text=">" android:onClick="next"/> <Button android:id="@+id/btnLast" android:width="175dp" android:text=">>" android:onClick="last"/> </TableRow> <TableRow> <TextView android:id="@+id/txtSearch" android:width="175dp" android:text="Search Name: "/> <AutoCompleteTextView android:id="@+id/txtSearchVal" android:width="175dp"/> </TableRow> <TableRow> <Button android:id="@+id/btnSearch" android:width="175dp" android:text="Search" android:onClick="search"/> <Button android:id="@+id/btnClearSearch" android:width="175dp" android:text="Clear Search" android:onClick="clearSearch"/> </TableRow> </TableLayout>
檢索圖像的地址,并使用以下命令訪問聯(lián)系人:
Uri contacts=ContactsContract.Contacts.CONTENT_URI;
接下來,我們創(chuàng)建一個CursorLoader對象按聯(lián)系人姓名的升序加載所有聯(lián)系人,如下:
CursorLoader loader=new
CursorLoader(this,contacts,null,null,null,ContactsContract.Contacts.DISPLAY_NAME+" asc");
該CursorLoader構(gòu)造采用下列參數(shù):
·Context context
·Uri uri
·String projection
·String selection
·String selectionArgs
·String sortOrder
下面的代碼將聯(lián)系人名稱填充字符串數(shù)組中:
c=loader.loadInBackground(); names=new String<span>[</span>c.getCount()]; int ctr=0; while(c.moveToNext()) { names<span>[</span>ctr]=c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); ctr++; }
在上面的代碼中,聯(lián)系人被加載到Cursor對象,該對象是一個使用loadInBackground()方法的CursorLoader類。所有聯(lián)系人姓名存儲在一個字符串數(shù)組中,并使用Cursor類中的MoveToNext()方法瀏覽所有聯(lián)系人。
此后一個ArrayAdapter被用于將聯(lián)系人姓名綁定到AutoCompleteTextView如下:
public void showContact(Cursor c) { String id=c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); String displayName=c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Bitmap photo; InputStream stream=ContactsContract.Contacts.openContactPhotoInputStream (getContentResolver(),ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,Long.parseLong(id))); if(stream!=null) { photo=BitmapFactory.decodeStream(stream); imgPhoto.setImageBitmap(photo); } else { imgPhoto.setImageBitmap(null); } Cursor phoneCursor=getContentResolver().query (ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+id,null,null); String number=""; if(phoneCursor.getCount()>0) { phoneCursor.moveToFirst(); number=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); while(phoneCursor.moveToNext()) { number+=","+phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } } phoneCursor.close(); txtIdVal.setText(id); txtDisplayNameVal.setText(displayName); txtPhoneNoVal.setText(number); enableDisableButtons(); }
上面的代碼使用cursor參數(shù)獲取聯(lián)系人的ID,顯示姓名,照片和電話號碼。它使用openContactPhotoInputStream()方法來為照片返回輸入流和decodeStream()方法來讀取照片。然后,它使用的setImageBitmap()方法在ImageView上顯示聯(lián)系人照片。當信息存儲在另一個表時,為了顯示電話號碼我們必須使用另一查詢。
以下代碼啟用和禁用基于所述查詢結(jié)果的導航按鈕:
public void enableDisableButtons() { if(c.isFirst()&&c.isLast()) { btnFirst.setEnabled(false); btnPrevious.setEnabled(false); btnNext.setEnabled(false); btnLast.setEnabled(false); } else if(c.isFirst()) { btnFirst.setEnabled(false); btnPrevious.setEnabled(false); btnNext.setEnabled(true); btnLast.setEnabled(true); } else if(c.isLast()) { btnFirst.setEnabled(true); btnPrevious.setEnabled(true); btnNext.setEnabled(false); btnLast.setEnabled(false); } else { btnFirst.setEnabled(true); btnPrevious.setEnabled(true); btnNext.setEnabled(true); btnLast.setEnabled(true); } }
點擊搜索按鈕允許你基于名稱在搜索文本框中搜索聯(lián)系方式,如下:
public void search(View v) { position=c.getPosition(); if(txtSearchVal.getText().toString().trim().length()>0) { Uri contacts=ContactsContract.Contacts.CONTENT_URI; CursorLoader loader=new CursorLoader (this,contacts,null,ContactsContract.Contacts.DISPLAY_NAME+"='"+txtSearchVal.getText().toString()+"'",null, ContactsContract.Contacts.DISPLAY_NAME+" asc"); c=loader.loadInBackground(); if(c.getCount()>0) { c.moveToFirst(); } } else { Uri contacts=ContactsContract.Contacts.CONTENT_URI; CursorLoader loader=new CursorLoader (this,contacts,null,null,null,ContactsContract.Contacts.DISPLAY_NAME+" asc"); c=loader.loadInBackground(); c.move(position); c.moveToNext(); } if(c.getCount()==0) { Toast.makeText(this,"No results found for contact "+txtSearchVal.getText().toString(),Toast.LENGTH_SHORT).show(); showAll(); return; } showContact(c); }
上面的代碼實現(xiàn)了通過聯(lián)系人姓名找到聯(lián)系方式功能。
點擊清除搜索文本框執(zhí)行下面的代碼:
public void clearSearch(View View) { showAll(); txtSearchVal.setText(""); } showAll()方法顯示所有聯(lián)系人,如下: public void showAll() { Uri contacts=ContactsContract.Contacts.CONTENT_URI; CursorLoader loader=new CursorLoader(this,contacts,null,null,null,ContactsContract.Contacts.DISPLAY_NAME+" asc"); c=loader.loadInBackground(); c.move(position); c.moveToNext(); showContact(c); }
下面的代碼可以使用導航按鈕導航:
public void first(View v) { c.moveToFirst(); showContact(c); } public void previous(View v) { c.moveToPrevious(); showContact(c); } public void next(View v) { c.moveToNext(); showContact(c); } public void last(View v) { c.moveToLast(); showContact(c); }
效果圖:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android?數(shù)據(jù)結(jié)構(gòu)全面總結(jié)分析
這篇文章主要為大家介紹了Android?數(shù)據(jù)結(jié)構(gòu)全面總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Android開發(fā) -- 控件的顯示與隱藏 setVisibility View.VISIBLE View.INVISI
本文簡單介紹在Android開發(fā)中控件的顯示與隱藏幾種常見的屬性,給大家一個參考,希望對大家學習有所幫助。2016-06-06android計算pad或手機的分辨率/像素/密度/屏幕尺寸/DPI值的方法
本文將介紹手機布局/界面設計/分辨率/密度相關,接下來介紹android計算pad或手機的分辨率像素等等的方法,感興趣的朋友可以了解下,希望本文可以幫助你2013-01-01android中DownloadManager實現(xiàn)版本更新,監(jiān)聽下載進度實例
本篇文章主要介紹了android中DownloadManager實現(xiàn)版本更新,監(jiān)聽下載進度實例。具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03基于Android CALL && SendMes Test的相關介紹
本篇文章小編為大家介紹,Android CALL && SendMes Test 需要的朋友參考下2013-04-04Android實現(xiàn)仿淘寶購物車增加和減少商品數(shù)量功能demo示例
這篇文章主要介紹了Android實現(xiàn)仿淘寶購物車增加和減少商品數(shù)量功能,結(jié)合實例形式分析了Android實現(xiàn)的淘寶購物車商品數(shù)量變換與計算相關技巧,需要的朋友可以參考下2016-07-07android camera yuv幀水平翻轉(zhuǎn)實例
今天小編就為大家分享一篇android camera yuv幀水平翻轉(zhuǎn)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08