【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡

上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用。这次要做设置向导界面的功能具体实现。

首先,4个界面分别是(重复度很大,这里就不再贴到正文中了)

  1. /mobilesafe/res/layout/setup_wizard1.xml
  2. /mobilesafe/res/layout/setup_wizard2.xml
  3. /mobilesafe/res/layout/setup_wizard3.xml
  4. /mobilesafe/res/layout/setup_wizard4.xml

Activity之间的切换动画效果

  • public void overridePendingTransition(int enterAnim, int exitAnim)

两个参数:

  • enterAnim:进入新Activity的动画效果
  • exitAnim:退出当前Activity的动画效果

创建动画效果:

  • /mobilesafe/res/anim/alpha_in.xml

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" >

</alpha>

为“下一步”按钮添加点击事件:


package com.liuhao.mobilesafe.ui;

import com.liuhao.mobilesafe.R;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SetupWizard1Activity extends Activity implements OnClickListener {

    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.setup_wizard1);

        button = (Button) this.findViewById(R.id.bt_next);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_next:
            finish();// 用户点击“后退”时不会再看到这个界面
            Intent intent = new Intent(this, SetupWizard2Activity.class);
            startActivity(intent);
            // 设置Activity切换时的动画效果
            overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);
            break;
        }
    }

}

设置界向导面2

需求功能: 1. 绑定SIM卡 2. CheckBox状态的处理 3. 上一步、下一步 点击功能的实现

  • 绑定SIM卡

在用户点击“绑定SIM卡”时,触发相应的处理逻辑,获取当前SIM卡的串号,并将串号存取到SharePreference中。

要获取手机SIM卡串号,需要添加权限:android.permission.READ_PHONE_STATE


/**
 * 绑定SIM串号
 *
 */
private void setSimInfo() {
    TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    String simSerialNumber = manager.getSimSerialNumber();
    Editor edit = sp.edit();
    edit.putString("sim", simSerialNumber);
    edit.commit();
    Toast.makeText(getApplicationContext(), "SIM卡已绑定", Toast.LENGTH_SHORT).show();
}
  • CheckBox状态的处理

// 首先初始化chexkbox的状态
String sim = sp.getString("sim", null);
if(sim != null){
    cb_bind.setText("已绑定SIM卡");
    cb_bind.setChecked(true);
}else{
    cb_bind.setText("未绑定SIM卡");
    cb_bind.setChecked(false);
}

cb_bind.setOnCheckedChangeListener(new OnCheckedChangeListener() {

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
        if(isChecked){
            setSimInfo();
            cb_bind.setText("已绑定SIM卡");
        }else{
            cb_bind.setText("未绑定SIM卡");
        }

    }
});

异常处理

弄好,运行代码,绑定手机SIM卡串号,没有问题。

再次打开,进入向导2界面时,出错,程序崩溃。

错误日志(摘取了主要部分)

E/AndroidRuntime(26463): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.liuhao.mobilesafe/com.liuhao.mobilesafe.ui.SetupWizard2Activity}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean

...

E/AndroidRuntime(26463): at com.liuhao.mobilesafe.ui.SetupWizard2Activity.onCreate(SetupWizard2Activity.java:42)

原因:

由于之前判断SharePreference中是否存在SIM信息是根据下面的逻辑:


// 首先初始化chexkbox的状态
if(sp.getBoolean("sim", false)){
    cb_bind.setText("已绑定SIM卡");
    cb_bind.setChecked(true);
}else{
    cb_bind.setText("未绑定SIM卡");
    cb_bind.setChecked(false);
}

boolean android.content.SharedPreferences.getBoolean(String key, boolean defValue)方法,

Retrieve a boolean value from the preferences.

Parameters: key The name of the preference to retrieve. defValue Value to return if this preference does not exist. Returns: Returns the preference value if it exists, or defValue. Throws ClassCastException if there is a preference
with this name that is not a boolean. Throws: ClassCastException

可以发现,若已存在值,而这个值不是Boolean类型时将会抛出ClassCastException。

修改


// 首先初始化chexkbox的状态
String sim = sp.getString("sim", null);
if(sim != null){
    cb_bind.setText("已绑定SIM卡");
    cb_bind.setChecked(true);
}else{
    cb_bind.setText("未绑定SIM卡");
    cb_bind.setChecked(false);
}

运行效果

完整代码:

时间: 2024-11-12 23:14:54

【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡的相关文章

【边做项目边学Android】手机安全卫士01:splash界面ui

手机安全卫士项目是跟着黑马的视频做的. splash是飞洒.飞溅的意思,主要是用于完成一个产品logo显示,期间可以: 后台完成数据库初始化的操作 联网访问服务器,获取服务器最新信息(升级提示) 不同的日期显示出来不同logo,判断当前系统时间,素材一般从服务器上下载下来. 判断时间,根据不同时间显示不同的加载页面 布局文件:splash.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayou

【边做项目边学Android】手机安全卫士09-手机防盗界面设置向导1

本次主要做手机防盗界面的设置向导功能界面的设计. 需求: 当用户进入手机防盗界面时,判断用户是否已经进行过设置向导: 如果用户已经设置过手机防盗,则不再提示用户进入手机向导 若还没有设置,则提示用户进入设置向导界面. 具体实现: 1.当用户输入"手机防盗"密码正确时,进行判断用户是否进行过设置向导 /** * 判断用户是否进行过设置向导 * @return */ private boolean isSetup(){ return sp.getBoolean("isAlread

【边做项目边学Android】手机安全卫士11-设置向导之设置安全号码

这次主要实现设置安全号码的功能,即当发现手机SIM卡信息发生改变时,会自动给安全号码发送一条报警短信.主要包括选择联系人功能.涉及到的知识点包括:带返回值的Intent,ListView数据适配器. 选择联系人功能 界面 用ListView来对读取的联系人进行展示 /mobilesafe/res/layout/select_contact.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayou

【边做项目边学Android】手机安全卫士03:获取更新的服务器配置,显示更新对话框

配置应用程序在手机桌面显示的名称和图标-AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.liuhao.mobilesafe" android:versionCode="

【边做项目边学Android】手机安全卫士04_01:界面(Activity)之间的切换,Activity和任务栈

上一回说到,用户选择是否升级,若用户选择不升级,那么就要进入程序的主界面.下面要做的是从splash界面跳转到main界面. MainActivity创建 1.首先新建MainActivity: package com.liuhao.mobilesafe.ui; import com.liuhao.mobilesafe.R; import android.app.Activity; import android.os.Bundle; public class MainActivity exten

【边做项目边学Android】手机安全卫士05_1:程序主界面

主界面布局(知识点:GridView) mainscreen.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=

【边做项目边学Android】手机安全卫士07-手机防盗之进入限制

上次写到在进入手机但·防盗界面时需要有密码限制,首先第一次进入时会弹出对话框提示用户设置密码:再次进入时会要求用户输入密码:这次来具体实现上述功能. 首次登录,设置密码 首先,我们的密码是保存在SharePreference中的"password"字段里的,在登录时后台需要校验该字段是否已经设置了密码,若未设置则弹出对话框让用户设置,否则要用户输入密码进入手机防盗界面: 校验是否设置了密码 @Override protected void onCreate(Bundle savedIn

【边做项目边学Android】手机安全卫士08-一些布局和显示的细节:State List

我们注意到有些应用里的按钮在点击时的显示状态和普通状态是不一样的,比如: 普通状态下: 选中状态下: 那这种效果是如何实现的呢?在Android系统中提供给我们一种方便与实现这种功能的方法即:state list drawable. StateListDrawable是在XML中定义的drawable对象,我们可以通过设置不同item下的图片来显示不同状态,这取决于 drawable对象的状态.例如,一个Button控件可以有不同的状态(点击.聚焦等),通过一系列的drawable对象,可以为每

【边做项目边学Android】手机安全卫士05_2:程序主界面,为每个条目添加事件

为每个条目添加点击事件监听器 gv_main.setOnItemClickListener(this); 需要当前Activity实现OnItemClickListener接口,同时实现public void onItemClick(AdapterView<?> parent, View view, int position,long id)方法 /** * 当gridview的条目被点击的时候对应的回调 * parent : gridView * view : 当前被点击条目的 Linear