手機衛士-02

手機衛士-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;
        }
    }
}
資料下載
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章