手机卫士-02

手机卫士-02

课1

手机卫士-02_第1张图片

把背景换了 给九宫格加格子框 增加一个shape类型的xml文件在drawable里

item_shape.xml




    
    


然后在GridView里注入这个shape类型的xml

itemmaingridview.xml



继续修改一些小边幅,例如字体的大小,图片的大小

欢迎界面里的代码

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



    

    

    
    
    
    

        

        

        

        

        
    

            

        

        

styles.xml









    

手机卫士-02_第2张图片

然后设计activityguide1.xml中的下一步调到activityguide2.xml 继续设计activity_guide2.xml

activity_guide2.xml



    

    

    
      

        

手机卫士-02_第3张图片

给以上这两个xml设置样式styles.xml,在activityguide1.xml里引用 设计第三个引导界面activityguide3.xml

activity_guide3.xml



    

   

    

    

手机卫士-02_第4张图片

设计第四个引导界面activity_guide4.xml

activity_guide4.xml



    

    

    

        

        

        

        

        
    

    

        
        

手机卫士-02_第5张图片

在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();
    }
}

手机卫士-02_第6张图片

因为后面会使用到查询联系人,所以把以前内容提供者里的提供读取联系人的信息到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






然后在activitylistviewcontact.xml里include进来,这样就方便些:公司开发比较多这种方式 为listview.xml设计一个容器布局itemcontact.xml文件

activitylistview_contact.xml




    

    


list_view.xml






item_contact.xml




    

    


开始设计SelectContentActivity里面的逻辑

通过已经包装好的Utils(内容提供者技术)获取联系人类存储到list里面

ContactInfoParser.java

public class ContactInfoParser {

    /**
     * 获取系统全部联系人的API方法
     * 
     * @param context
     * @return
     */
    public static List 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 infos = new ArrayList();
        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 extends BaseAdapter {


    public List lists;
    public View q;
    public Context context;



    public MyBaseAdapter(List lists, Context context) {
        super();
        this.lists = lists;
        this.context = context;
    }

    public MyBaseAdapter(List 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 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{

        public ContactAdapter(Context context,
                List 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;
        }
    }
}
资料下载

你可能感兴趣的:(android项目,android开发)