很多时候刚安装apk会出出现一个导航页,导航页可以实现左右滑动,切换等等操作,主要是引导一些设置,这种设置很受欢迎。
这个里面是在一个设置页面上面实现的,直接跳转activity的方式来切换导航.因为只需要一次导航,所以可以使用SharePreference中保存某一个flag来确定是不是要进行导航。由于很多导航是一样的操作,因此可以弄一个BaseActivity,这个activity不需要节面,将一些方法封装,然后通过抽象类来让子类去实现这些方法
入口页面LostAndFind.java
package com.ldw.safe.Activity;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.ldw.safe.R;
/*
* 手机防盗页面
*/
public class LostAndFind extends Activity {
private SharedPreferences mPref;
private TextView tvSafePhone;
private ImageView ivProtect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//判断是否是第一次登陆,第一次登陆会进入设置向导
mPref = getSharedPreferences("config", MODE_PRIVATE);
boolean configed = mPref.getBoolean("configed", false);
if(configed){
//进入手机放到主页面
setContentView(R.layout.activity_lostfind);
//从mPref中获取到安全号码
tvSafePhone = (TextView) findViewById(R.id.tv_safe_phone);
String phone = mPref.getString("safe_phone", "");
tvSafePhone.setText(phone);
//从mPref中获取是否是开启保护的状态,来选择后面的图片是开启还是关闭
ivProtect = (ImageView) findViewById(R.id.iv_protect);
boolean protect = mPref.getBoolean("protect", false);
if(protect){
ivProtect.setImageResource(R.drawable.lock);
}else{
ivProtect.setImageResource(R.drawable.unlock);
}
}else{
//跳转到设置向导页
startActivity(new Intent(LostAndFind.this, Setup1Activity.class));
finish();
}
}
/*
* 重新进入设置向导
*/
public void reEnter(View v){
startActivity(new Intent(LostAndFind.this, Setup1Activity.class));
finish();
}
}
布局页面activity_lostfind.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/TitleStyle"
android:text="手机防盜"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
style="@style/ContentStyle"
android:text="安全号码" />
<TextView
android:id="@+id/tv_safe_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:layout_centerVertical="true"
android:textSize="20sp"
android:textColor="@color/black"/>
</RelativeLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:background="@drawable/listview_divider"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
style="@style/ContentStyle"
android:text="防盗保护是否开启" />
<ImageView
android:id="@+id/iv_protect"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:layout_centerVertical="true"
android:src="@drawable/lock" />
</RelativeLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:background="@drawable/listview_divider"
/>
<TextView
style="@style/ContentStyle"
android:layout_width="match_parent"
android:layout_marginRight="5dp"
android:onClick="reEnter"
android:clickable="true"
android:background="@drawable/shape_selector"
android:text="重新进入设置向导" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:background="@drawable/listview_divider"
/>
<TextView
android:background="#885500"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="功能简介"
android:textSize="20sp"
android:textColor="@color/black"
android:layout_marginRight="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:padding="3dp"
/>
<TextView
style="@style/ContentStyle"
android:drawableLeft="@android:drawable/star_big_on"
android:layout_gravity="center"
android:text="GPS跟踪#*Location*#"
/>
<TextView
style="@style/ContentStyle"
android:drawableLeft="@android:drawable/star_big_on"
android:layout_gravity="center"
android:text="播放报警音乐#*alarm*#"
/>
<TextView
style="@style/ContentStyle"
android:drawableLeft="@android:drawable/star_big_on"
android:layout_gravity="center"
android:text="远程删除数据#*wipedata*#"
/>
<TextView
style="@style/ContentStyle"
android:drawableLeft="@android:drawable/star_big_on"
android:layout_gravity="center"
android:text="远程锁屏#*lookscreen*#"
/>
</LinearLayout>
下面的是几个切换的特效页面
Setup1Activity.java
package com.ldw.safe.Activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import com.ldw.safe.R;
/*
* 手机防盗第一个设置向导页面
*/
public class Setup1Activity extends BaseSetupActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup1);
}
//显示下一页,这个需要子类去实现,跳转的页面不是固定的
public void showNext(){
//页面跳转
startActivity(new Intent(Setup1Activity.this, Setup2Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画
}
//没有上一页,什么都不做
@Override
public void showPrevious() {
// TODO Auto-generated method stub
}
}
Setup2Activity.java
package com.ldw.safe.Activity;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import com.ldw.safe.R;
import com.ldw.safe.view.SettingItemView;
/*
* 手机防盗第二个设置向导页面
*/
public class Setup2Activity extends Activity {
public SharedPreferences mPref;
private GestureDetector mDector;
private SettingItemView siv_sim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup2);
mPref = getSharedPreferences("config", MODE_PRIVATE);
//创建手势识别器
mDector = new GestureDetector(this, new SimpleOnGestureListener(){
//监听手势滑动动作,e1是滑动的起始点,e2是滑动的终点。后2个参数是X,Y速度
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
//获取到相对于屏幕的相对坐标,设置最小的滑动距离
//向右滑动,上一页
if((e2.getRawX() - e1.getRawX()) > 200){
showPrevious();
return true;
}
//向左滑动,下一页
if((e1.getRawX() - e2.getRawX()) > 200){
showNext();
return true;
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
//监听sim卡
siv_sim = (SettingItemView) findViewById(R.id.siv_sim);
//看一下存储的值来设置是否选中
String sim = mPref.getString("sim", null);
if(!TextUtils.isEmpty(sim)){
siv_sim.setChecked(true);
}else{
siv_sim.setChecked(false);
}
siv_sim.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(siv_sim.isChecked()){
siv_sim.setChecked(false);
//解绑sim卡的序列号
mPref.edit().remove("sim").commit();
}else{
siv_sim.setChecked(true);
//保存sim卡信息
//读取sim卡的序列号
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
String simSerialNumber = tm.getSimSerialNumber();//获取到序列号
System.out.println("sim卡序列号" + simSerialNumber);
//保存sim卡的序列号
mPref.edit().putString("sim", simSerialNumber).commit();
}
}
});
}
//显示上一页
public void showPrevious(){
//页面跳转
startActivity(new Intent(Setup2Activity.this, Setup1Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画
}
//显示下一页
public void showNext(){
//如果sim卡没有绑定就不让进入下一页
String sim = mPref.getString("sim", null);
if(TextUtils.isEmpty(sim)){
Toast.makeText(this, "sim卡没有绑定", Toast.LENGTH_SHORT).show();
return;
}
//页面跳转
startActivity(new Intent(Setup2Activity.this, Setup3Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画
}
//点击按钮跳转到下一页
public void next(View v){
showNext();
/*
//页面跳转
startActivity(new Intent(Setup2Activity.this, Setup3Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画
*/
}
//点击按钮跳转到上一页
public void previous(View v){
showPrevious();
/*
//页面跳转
startActivity(new Intent(Setup2Activity.this, Setup1Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画
*/
}
//处理手势滑动页面的处理,委托给GestureDetector手势识别器处理
@Override
public boolean onTouchEvent(MotionEvent event){
//手势识别器进行处理
mDector.onTouchEvent(event);
return super.onTouchEvent(event);
}
}
Setup3Activity.java
package com.ldw.safe.Activity;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.ldw.safe.R;
/*
* 手机防盗第三个设置向导页面
*/
public class Setup3Activity extends BaseSetupActivity {
private EditText etPhone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup3);
etPhone = (EditText) findViewById(R.id.et_phone);
String phone = mPref.getString("safe_phone", "");
etPhone.setText(phone);
}
//显示上一页,这个需要子类去实现,跳转的页面不是固定的
public void showPrevious(){
//页面跳转
startActivity(new Intent(Setup3Activity.this, Setup2Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画
}
//显示下一页,这个需要子类去实现,跳转的页面不是固定的
public void showNext(){
//判断是否设置安全号码,trim来过滤空格
String phone = etPhone.getText().toString().trim();
if(TextUtils.isEmpty(phone)){
Toast.makeText(this, "安全号码不能是空", Toast.LENGTH_SHORT).show();
return;
}
//保存安全号码
mPref.edit().putString("safe_phone", phone).commit();
//页面跳转
startActivity(new Intent(Setup3Activity.this, Setup4Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画
}
//选择联系人
public void selectContact(View v){
//跳转到ContactActivity界面,同时返回数据
Intent intent = new Intent(this, ContactActivity.class);
startActivityForResult(intent, 0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
//如果请求码是ok的时候才会去获取回传的数据
if(resultCode == Activity.RESULT_OK){
String phone = data.getStringExtra("phone");
//把电话号码里面的-去掉,并将空格去掉
phone = phone.replaceAll("-", "").replaceAll(" ", "");
//把返回的电话号码设置到输入框
etPhone.setText(phone);//
}
super.onActivityResult(requestCode, resultCode, data);
}
}
Setup4Activity.java
package com.ldw.safe.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import com.ldw.safe.R;
/*
* 手机防盗第四个设置向导页面
*/
public class Setup4Activity extends BaseSetupActivity {
private CheckBox cbProtect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup4);
cbProtect = (CheckBox) findViewById(R.id.cb_protect);
//根据保存的状态保存是否开启
boolean protect = mPref.getBoolean("protect", false);
if(protect){
cbProtect.setText("防盗保护已经开启");
cbProtect.setChecked(true);
}else{
cbProtect.setText("防盗保护没有开启");
cbProtect.setChecked(false);
}
//监听checkBox,并保存checkbox状态
cbProtect.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked){
cbProtect.setText("防盗保护已经开启");
mPref.edit().putBoolean("protect", true).commit();
}else{
cbProtect.setText("防盗保护没有开启");
mPref.edit().putBoolean("protect", false).commit();
}
}
});
}
//显示上一页,这个需要子类去实现,跳转的页面不是固定的
public void showPrevious(){
//页面跳转
startActivity(new Intent(Setup4Activity.this, Setup3Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画
}
//显示下一页,这个需要子类去实现,跳转的页面不是固定的
public void showNext(){
//页面跳转
startActivity(new Intent(Setup4Activity.this, LostAndFind.class));
//销毁当前页面
finish();
//更新mPref表示已经展示过设置向导,下次进来不展示更新向导
mPref.edit().putBoolean("configed", true).commit();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画
}
}
公共activity==BaseActivity.jav
package com.ldw.safe.Activity;
import com.ldw.safe.R;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
/*
* 设置引导页面的父类,这个基类不需要在Manifist文件中注册,因为其不需要展示
* 里面有抽象方法,类设置成抽象类
*/
public abstract class BaseSetupActivity extends Activity {
public SharedPreferences mPref;
private GestureDetector mDector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setup2);
mPref = getSharedPreferences("config", MODE_PRIVATE);
//创建手势识别器
mDector = new GestureDetector(this, new SimpleOnGestureListener(){
//监听手势滑动动作,e1是滑动的起始点,e2是滑动的终点。后2个参数是X,Y速度
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
//防止上滑动和下滑动幅度过大,不让切换
if(Math.abs(e2.getRawY() - e1.getRawY()) > 200){
return true;
}
//滑动的速度不能太慢
if(Math.abs(velocityX) < 100){
return true;
}
//获取到相对于屏幕的相对坐标,设置最小的滑动距离
//向右滑动,上一页
if((e2.getRawX() - e1.getRawX()) > 200){
showPrevious();
return true;
}
//向左滑动,下一页
if((e1.getRawX() - e2.getRawX()) > 200){
showNext();
return true;
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}
//显示上一页,这个需要子类去实现,跳转的页面不是固定的,抽象方法,强制子类去实现
public abstract void showPrevious();
//显示下一页,这个需要子类去实现,跳转的页面不是固定的
public abstract void showNext();
//点击按钮跳转到下一页
public void next(View v){
showNext();
/*
//页面跳转
startActivity(new Intent(Setup2Activity.this, Setup3Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_in, R.anim.tran_out);//进入动画和推出动画
*/
}
//点击按钮跳转到上一页
public void previous(View v){
showPrevious();
/*
//页面跳转
startActivity(new Intent(Setup2Activity.this, Setup1Activity.class));
//销毁当前页面
finish();
//两个界面的切换动画
overridePendingTransition(R.anim.tran_previous_in, R.anim.tran_previous_out);//进入动画和推出动画
*/
}
//处理手势滑动页面的处理,委托给GestureDetector手势识别器处理
@Override
public boolean onTouchEvent(MotionEvent event){
//手势识别器进行处理
mDector.onTouchEvent(event);
return super.onTouchEvent(event);
}
}