手機衛士-02
課1
把背景換了 給九宮格加格子框 增加一個shape類型的xml文件在drawable裏
item_shape.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 設置描邊
android:width="1dp" 設置描邊的寬度
android:color="#505050" 設置描邊的顏色
-->
<stroke android:width="1dp"
android:color="#505050"
/>
</shape>
然後在GridView裏注入這個shape類型的xml
itemmaingridview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:background="@drawable/item_shape"
android:orientation="vertical" >
繼續修改一些小邊幅,例如字體的大小,圖片的大小
歡迎界面裏的代碼
case SHOW_DIALOG:
AlertDialog.Builder builder = new Builder(SplashActivity.this);
builder.setTitle("有新版本");
builder.setMessage(desc);
//屏蔽後退按鈕
//builder.setCancelable(false);
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
mainUI();
}
});
研究下以下代碼:
AlertDialog.Builder builder = new Builder(SplashActivity.this);
改成
AlertDialog.Builder builder = new Builder(getApplicationContext());
就報錯了,爲什麼?
getApplicationContext()的所有的上下文父類
SplashActivity.this是它的子類
而對話框是當前上下文中的一個窗體,這樣的話如果是寫getApplicationContext()就不知道SplashActivity.this有對話框dialog,對話框彈出就會出錯
繼續實現引導界面
GuideActivity1.java
首先給它設計xml界面:activityguide1.xml activityguide1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/startpage" >
<TextView
style="@style/textview_title_style"
android:text="歡迎使用手機防盜"
android:textColor="#E2DED8"/>
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="您的手機防盜衛士"
android:textSize="28sp"
android:textColor="#E2DED8"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@android:drawable/star_big_on"
android:text="sim卡變更警報"
android:textSize="24sp"
android:textColor="#E2DED8"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@android:drawable/star_big_on"
android:text="GPS追蹤"
android:textSize="24sp"
android:textColor="#E2DED8"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@android:drawable/star_big_on"
android:text="遠程鎖屏"
android:textSize="24sp"
android:textColor="#E2DED8"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@android:drawable/star_big_on"
android:text="遠程銷燬數據"
android:textSize="24sp"
android:textColor="#E2DED8"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_online" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/setup1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="@drawable/btn_selector"
android:drawableRight="@drawable/next"
android:onClick="next"
android:text="下一步" />
</RelativeLayout>
</LinearLayout>
styles.xml
<!-- <TextView -->
<!-- android:layout_width="match_parent" -->
<!-- android:layout_height="40dp" -->
<!-- android:background="#4400ff00" -->
<!-- android:text="歡迎使用手機防盜" -->
<!-- android:textSize="24sp" /> -->
<style name="textview_title_style">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">40dp</item>
<item name="android:background">#4400ff00</item>
<item name="android:textSize">24sp</item>
</style>
然後設計activityguide1.xml中的下一步調到activityguide2.xml 繼續設計activity_guide2.xml
activity_guide2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/startpage" >
<TextView
style="@style/textview_title_style"
android:text="手機卡綁定"
android:textColor="#E2DED8"/>
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="通過綁定sim卡:"
android:textSize="28sp"
android:textColor="#E2DED8" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="如果下次重啓手機之後sim卡發生變化\n就會發送報警短信"
android:textSize="18sp"
android:textColor="#E2DED8"/>
<RelativeLayout
android:id="@+id/rl_lock"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/btn_selector"
android:onClick="simUnbinder"
android:text="點擊綁定/解綁sim卡" />
<ImageView
android:id="@+id/iv_lock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@drawable/unlock"/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_online" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/setup1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:background="@drawable/btn_selector"
android:drawableLeft="@drawable/previous"
android:onClick="pre"
android:text="上一步" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="@drawable/btn_selector"
android:drawableRight="@drawable/next"
android:onClick="next"
android:text="下一步" />
</RelativeLayout>
</LinearLayout>
給以上這兩個xml設置樣式styles.xml,在activityguide1.xml裏引用 設計第三個引導界面activityguide3.xml
activity_guide3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/startpage" >
<TextView
style="@style/textview_title_style"
android:text="設置安全號碼"
android:textColor="#E2DED8"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="sim發生變化就會報警:\n報警短信就會發送給安全號碼"
android:textSize="18sp"
android:textColor="#E2DED8" />
<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入安全號碼"
android:inputType="phone"
android:textColor="#E2DED8" />
<Button
android:onClick="selectContact"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/btn_selector"
android:text="選擇安全號碼"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_online" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/setup1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="@drawable/btn_selector"
android:drawableRight="@drawable/next"
android:onClick="next"
android:text="下一步" />
</RelativeLayout>
</LinearLayout>
設計第四個引導界面activity_guide4.xml
activity_guide4.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/startpage" >
<TextView
style="@style/textview_title_style"
android:text="恭喜您設置完成"
android:textColor="#E2DED8"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打勾,開啓防盜保護"
android:textSize="24sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_invisible" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:drawable/presence_online" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/setup1" />
<Button
android:onClick="pre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:background="@drawable/btn_selector"
android:drawableLeft="@drawable/previous"
android:text="上一步" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="@drawable/btn_selector"
android:drawableRight="@drawable/next"
android:onClick="next"
android:text="下一步" />
</RelativeLayout>
</LinearLayout>
在GuideActivity1.java、GuideActivity2.java、GuideActivity3.java、GuideActivity4.java分別引進activityguide1.xml、activityguide2.xml、activityguide3.xml、activityguide4.xml,並實現上一步下一步的單擊按鈕功能:界面跳轉
在GuideActivity1.java
package com.itheima.phonesafeguard;
public class GuideActivity1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// TextView textView = new TextView(this);
// textView.setText("我是引導界面");
// setContentView(textView);
setContentView(R.layout.activity_guide1);
}
public void next(View view){
Intent intent = new Intent(GuideActivity1.this,GuideActivity2.class);
startActivity(intent);
finish();
}
public void pre(View view){
Intent intent = new Intent(GuideActivity1.this,MainActivity.class);
startActivity(intent);
finish();
}
}
課2
實現界面2(GuideActivity2.java)裏的sim卡綁定的功能 在裏面使用服務:
//獲取到電話相關的服務 TelephonyManager tm = getSystemService(TELEPHONY_SERVICE);
在該界面裏的下一步按鈕需要檢測有沒綁定sim卡才能進入下個界面
//綁定或者解綁sim卡 public void simUnbinder(View view){ //唯一標識符 // String sim = tm.getSimSerialNumber(); // Editor ed = sp.getEditedit(); // ed.putString("sim",sim); SharedPreferencesUtils.saveString(this,"sim",sim); }
我們在使用SharedPreference是頻率很高,不抽取出來那是使工程的代碼太冗餘,那麼我們抽取成工具類來使用:SharedPreferenceUtils--->saveString()+getString()
SharedPreferencesUtil.java
package com.itheima.Utils;
import android.content.Context;
import android.content.SharedPreferences;
/*
* 通用的sharedpreference工具類
*/
public class SharedPreferencesUtil {
private static final String SP_NAME = "config";
private static SharedPreferences sp;
public static void saveString(Context context,String key ,String value){
sp = context.getSharedPreferences(SP_NAME, 0);
sp.edit().putString(key, value).commit();
}
public static String getString(Context context,String key ,String value){
if(sp==null)
sp = context.getSharedPreferences(SP_NAME, 0);
return sp.getString(key, value);
}
public static void cleanData(Context context,String key ){
if(sp==null)
sp = context.getSharedPreferences(SP_NAME, 0);
sp.edit().putString(key, "").commit();
}
public static void saveInt(Context context,String key ,int value){
if(sp==null)
sp = context.getSharedPreferences(SP_NAME, 0);
sp.edit().putInt(key, value).commit();
}
}
實現下一步按鈕功能
public void next(View view){
//獲取到sim卡的值 String result = SharedPreferencesUtils.getString(this,"sim","");
if(空){
綁定卡操作
}else{
調到下一個界面
建議finish();
}
}
點擊綁定按鈕後,設置按鈕上的圖片,切換成關鎖的圖片切換:simUnbinder(View view)裏進行控制,再次點擊同個按鈕,就解綁,即清空sharedpreference
GuideActivity2.java
public class GuideActivity2 extends Activity {
@ViewInject(R.id.rl_lock)
private RelativeLayout rl_lock;
@ViewInject(R.id.iv_lock)
private ImageView iv_lock;
private TelephonyManager tm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_guide2);
//使用xUtils注入控件使用
ViewUtils.inject(this);
//當打開界面2的時候,會去檢查在sharedpreference裏面有沒有存放sim卡的信息
//以此來切換按鈕右邊的鎖頭圖標的樣式
String saveSim = SharedPreferencesUtil.getString(this, "sim", "");
if(TextUtils.isEmpty(saveSim)){
iv_lock.setBackgroundResource(R.drawable.unlock);
}else{
iv_lock.setBackgroundResource(R.drawable.lock);
}
//當初始化了該頁面,主要是需要綁定SIM卡
//即通過系統提供的服務來獲取讀取sim卡里的信息,然後存放到sharedpreference裏面
//獲取到電話相關的服務
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
}
//綁定和解綁按鈕
public void simUnbinder(View view){
String saveSim = SharedPreferencesUtil.getString(this, "sim", "");
if(TextUtils.isEmpty(saveSim)){
//即由於sp裏沒有sim信息,那麼就通過點擊該按鈕來爲sp存入信息,並把鎖頭切換爲鎖上的圖標
iv_lock.setBackgroundResource(R.drawable.lock);
String sim = tm.getSimSerialNumber();
SharedPreferencesUtil.saveString(this, "sim", sim);
}else{
//如果不爲空,即操作解綁,並且把圖標切換成鎖頭解開的狀態,並清空sp裏面的sim信息
iv_lock.setBackgroundResource(R.drawable.unlock);
SharedPreferencesUtil.cleanData(this, "sim");
}
}
public void next(View view){
//點擊下一步的操作時,如果發現sp裏的sim信息爲空,即沒綁定,那麼就不允許進入到下一步的界面
String result = SharedPreferencesUtil.getString(this, "sim", "");
if(TextUtils.isEmpty(result)){
Toast.makeText(this, "請綁定sim卡", 0).show();
}else{
Intent intent = new Intent(GuideActivity2.this,GuideActivity3.class);
startActivity(intent);
finish();
}
}
public void pre(View view){
Intent intent = new Intent(GuideActivity2.this,GuideActivity1.class);
startActivity(intent);
finish();
}
}
在界面三(GuideActivity2.java設置安全號碼)
使用Xutils去獲得editText裏的安全號碼,並存儲 設置點擊安全號碼按鈕後的功能:next() public void next(View view){ //判斷當前的EditText是否爲null //沒有就友情提示下 //如果不爲空,保存到sp裏就進入到下一個界面 }
課3
繼續修改GuideActivity2裏的小bug,就是鎖頭圖片的切換: 就是在初始化該頁面時就檢查sp裏有沒sim,而相對應去切換鎖頭圖片
GuideActivity2.java
public class GuideActivity2 extends Activity {
@ViewInject(R.id.rl_lock)
private RelativeLayout rl_lock;
@ViewInject(R.id.iv_lock)
private ImageView iv_lock;
private TelephonyManager tm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_guide2);
//使用xUtils注入控件使用
ViewUtils.inject(this);
//當打開界面2的時候,會去檢查在sharedpreference裏面有沒有存放sim卡的信息
//以此來切換按鈕右邊的鎖頭圖標的樣式
String saveSim = SharedPreferencesUtil.getString(this, "sim", "");
if(TextUtils.isEmpty(saveSim)){
iv_lock.setBackgroundResource(R.drawable.unlock);
}else{
iv_lock.setBackgroundResource(R.drawable.lock);
}
//當初始化了該頁面,主要是需要綁定SIM卡
//即通過系統提供的服務來獲取讀取sim卡里的信息,然後存放到sharedpreference裏面
//獲取到電話相關的服務
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
}
//綁定和解綁按鈕
public void simUnbinder(View view){
String saveSim = SharedPreferencesUtil.getString(this, "sim", "");
if(TextUtils.isEmpty(saveSim)){
//即由於sp裏沒有sim信息,那麼就通過點擊該按鈕來爲sp存入信息,並把鎖頭切換爲鎖上的圖標
iv_lock.setBackgroundResource(R.drawable.lock);
String sim = tm.getSimSerialNumber();
SharedPreferencesUtil.saveString(this, "sim", sim);
}else{
//如果不爲空,即操作解綁,並且把圖標切換成鎖頭解開的狀態,並清空sp裏面的sim信息
iv_lock.setBackgroundResource(R.drawable.unlock);
SharedPreferencesUtil.cleanData(this, "sim");
}
}
public void next(View view){
//點擊下一步的操作時,如果發現sp裏的sim信息爲空,即沒綁定,那麼就不允許進入到下一步的界面
String result = SharedPreferencesUtil.getString(this, "sim", "");
if(TextUtils.isEmpty(result)){
Toast.makeText(this, "請綁定sim卡", 0).show();
}else{
Intent intent = new Intent(GuideActivity2.this,GuideActivity3.class);
startActivity(intent);
finish();
}
}
public void pre(View view){
Intent intent = new Intent(GuideActivity2.this,GuideActivity1.class);
startActivity(intent);
finish();
}
}
因爲後面會使用到查詢聯繫人,所以把以前內容提供者裏的提供讀取聯繫人的信息到Activity界面裏 新建一個ContactInfo類,用來存儲從手機數據庫裏讀取到的聯繫人信息封裝成ContactInfo類
ContactInfo.class
package com.itheima.phonesafeguard.bean;
public class ContactInfo {
private String name;
private String email;
private String phone;
private String id;
private String qq;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
}
繼續設計從第三個界面裏的下一步可以切換到的一個新界面SelectContactActivity(設計這個界面:通過讀取本地的聯繫人數據庫:使用內容提供者技術) 新建xml佈局文件activitylistview_contact.xml
在該佈局裏要用到listView,但是考慮到以後使用ListView的機會很多,我們就單獨新建一個ListView.xml
ListView.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</ListView>
然後在activitylistviewcontact.xml裏include進來,這樣就方便些:公司開發比較多這種方式 爲listview.xml設計一個容器佈局itemcontact.xml文件
activitylistview_contact.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
style="@style/textview_title_style"
android:gravity="center"
android:text="選擇聯繫人" />
<include layout="@layout/list_view" />
</LinearLayout>
list_view.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</ListView>
item_contact.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="xxxx"
android:gravity="center"
android:textSize="28sp"
android:textColor="#000"/>
<TextView
android:id="@+id/tv_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="xxxx"
android:gravity="center"
android:textSize="24sp"
android:textColor="#88000000"/>
</LinearLayout>
開始設計SelectContentActivity裏面的邏輯
通過已經包裝好的Utils(內容提供者技術)獲取聯繫人類存儲到list裏面
ContactInfoParser.java
public class ContactInfoParser {
/**
* 獲取系統全部聯繫人的API方法
*
* @param context
* @return
*/
public static List<ContactInfo> findAll(Context context) {
ContentResolver resolver = context.getContentResolver();
// 1. 查詢raw_contacts表,把聯繫人的id取出來
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
List<ContactInfo> infos = new ArrayList<ContactInfo>();
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
if (id != null) {
System.out.println("聯繫人id:" + id);
ContactInfo info = new ContactInfo();
info.setId(id);
// 2. 根據聯繫人的id,查詢data表,把這個id的數據取出來
// 系統api 查詢data表的時候 不是真正的查詢data表 而是查詢的data表的視圖
Cursor dataCursor = resolver.query(datauri, new String[] {
"data1", "mimetype" }, "raw_contact_id=?",
new String[] { id }, null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
if ("vnd.android.cursor.item/name".equals(mimetype)) {
System.out.println("姓名=" + data1);
info.setName(data1);
} else if ("vnd.android.cursor.item/email_v2"
.equals(mimetype)) {
System.out.println("郵箱=" + data1);
info.setEmail(data1);
} else if ("vnd.android.cursor.item/phone_v2"
.equals(mimetype)) {
System.out.println("電話=" + data1);
info.setPhone(data1);
} else if ("vnd.android.cursor.item/im".equals(mimetype)) {
System.out.println("QQ=" + data1);
info.setQq(data1);
}
}
infos.add(info);
System.out.println("------");
dataCursor.close();
}
}
cursor.close();
return infos;
}
}
然後放入到listview裏面 然後在界面3(GuideActivity3)裏通過點擊下一步按鈕就跳到SelectContentActivity的界面--->listview展示出聯繫人
定義一個新的Adapter適配器,用來過濾掉不需要的方法。
MyBaseAdapter.java
public abstract class MyBaseAdapter<T,V> extends BaseAdapter {
public List<T> lists;
public View q;
public Context context;
public MyBaseAdapter(List<T> lists, Context context) {
super();
this.lists = lists;
this.context = context;
}
public MyBaseAdapter(List<T> lists, View q, Context context) {
super();
this.lists = lists;
this.q = q;
this.context = context;
}
public MyBaseAdapter() {
super();
// TODO Auto-generated constructor stub
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return lists.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return lists.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
}
新建MyBaseAdapter繼承BaseAdapter
還使用到泛型,使用泛型來爲getCount(){},getItem(){}等方法重寫,而提供出getView的抽象方法提供出去給我們繼承。 繼續實現getView裏的聯繫人顯示方法 繼續設置點擊SelectContentActivity的界面裏的聯繫人而返回界面三去設置安全號碼:設置點擊事件給list_view 在SelectContentActivity把電話號碼通過意圖傳到界面三拿出來
SelectContactActivity.java
public class SelectContactActivity extends Activity {
private List<ContactInfo> mContactInfos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_list_view_contact);
ViewUtils.inject(this);
ListView list_view = (ListView) findViewById(R.id.list_view);
//獲取到所有的聯繫人
mContactInfos = ContactInfoParser.findAll(this);
ContactAdapter adapter = new ContactAdapter(this,mContactInfos);
list_view.setAdapter(adapter);
// list_view.setOnItemClickListener(new OnItemClickListener() {
//
// @Override
// public void onItemClick(AdapterView<?> parent, View view,
// int position, long id) {
// Intent data = new Intent();
// String phone = mContactInfos.get(position).getPhone();
// data.putExtra("phone", phone);
// setResult(0, data);
// finish();
// }
//
// });
}
//點擊獲取聯繫人
/*
* 該listView監聽器用來監聽點擊事件
* 使用了XUtils的監聽效果@OnItemClick(R.id.list_view)
* 當點擊了其中一個list_view時,把phone返回給指定的頁面去讓它獲取
*/
@OnItemClick(R.id.list_view)
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent data = new Intent();
String phone = mContactInfos.get(position).getPhone();
data.putExtra("phone", phone);
setResult(0, data);
finish();
}
//這個內部類是自定義出來給ListView使用的,而我們考慮到每次自定義的適配器只想使用到getView的方法,所以繼承了已經做過過濾方法處理的自定義適配器,這樣就不用重寫別的沒用的方法而直接使用getView方法
private class ContactAdapter extends MyBaseAdapter<ContactInfo,ListView>{
public ContactAdapter(Context context,
List<ContactInfo> mContactInfos) {
super(mContactInfos, context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*
* 這裏的邏輯主要是,
* 在一個activity_list_view_contact.xml裏,用來顯示選擇聯繫人界面
* 然後在裏面,提供了一個標題控件和listView控件
* 由於考慮到以後經常使用到listview控件,我們把listview獨立分離出一個xml文件出來,然後在activity_list_view_contact.xml裏引用
* 而在這裏,我們用過使用inflate方法給listview又注入了一個新的xml佈局文件item_contact.xml文件
*/
View view = View.inflate(context, R.layout.item_contact, null);
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
tv_name.setText(lists.get(position).getName());
tv_phone.setText(lists.get(position).getPhone());
return view;
}
}
}
資料下載