把背景换了 给九宫格加格子框 增加一个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
然后设计activityguide1.xml中的下一步调到activityguide2.xml 继续设计activity_guide2.xml
activity_guide2.xml
给以上这两个xml设置样式styles.xml,在activityguide1.xml里引用 设计第三个引导界面activityguide3.xml
activity_guide3.xml
设计第四个引导界面activity_guide4.xml
activity_guide4.xml
在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(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里就进入到下一个界面 }
继续修改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
然后在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;
}
}
}
资料下载