【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

发表于 2013-7-11 14:42:02 浏览(229501)

这篇文章算是对整个引导界面开发专题的一个终结了吧,个人觉得大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要是在今后的开发中遇到了更好玩,更有趣的引导界面,博主也会在这里及时的跟大家分享,今天的内容主要是教大家的应用程序只有在第一次启动的时候显示引导界面,以后在启动程序的时候就不再显示了。

其实要想实现这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单,下面来详细介绍一下这个类的使用方法

一、SharedPreferences的详细介绍和用法

SharedPreferences介绍:       做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。SharedPreferences正是Android中用于实现这中存储方式的技术。

SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。

SharedPreferences使用方法:

<1> 使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定;

<2> 使用SharedPreferences接口的edit获得SharedPreferences.Editor对象;

<3> 通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法;

<4> 通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。

具体代码的书写流程为:

A、存放数据信息

<1> 打开Preferences,名称为setting,如果存在则打开它,否则创建新的Preferences

SharedPreferences settings = getSharedPreferences(“setting”, 0);

<2> 让setting处于编辑状态

SharedPreferences.Editor editor = settings.edit();

<3> 存放数据

editor.putString(“name”,”ATAAW”);
         editor.putString(“URL”,”ATAAW.COM”);

<4> 完成提交

editor.commit();

B、读取数据信息

<1> 获取Preferences

SharedPreferences settings = getSharedPreferences(“setting”, 0);

<2> 取出数据

String name = settings.getString(“name”,”默认值”);
         String url = setting.getString(“URL”,”default”);

以上就是SharedPreferences的使用方法,其中创建的Preferences文件存放位置可以在Eclipse中查看:

DDMS->File Explorer /<package name>/shared_prefs/setting.xml

二、实现的效果图

第一次启动程序:欢迎界面-->引导界面-->主页面

以后启动程序:启动页-->系统主页

第一次启动时的效果图

欢迎界面:

引导界面效果图1:

引导界面效果图2:

进入主页面:

以后启动程序的效果图

欢迎界面:

程序主页面:

三、程序的目录结构


四、具体的实现编码

1、  在引导布局界面中加入ViewPager组件,activity_guide.xml:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content" >
  5. <android.support.v4.view.ViewPager
  6. android:id="@+id/viewpager"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent" />
  9. </RelativeLayout>

复制代码

2、接着在guide_view01.xml等几个布局页面中添加引导界面要显示的图片和控件,因为这几个布局界面都大同小异,所以在这里我就不一一贴出来了吧,有需要的同学可以直接下载源码,guide_view01.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="@drawable/star_img1"
  6. android:orientation="vertical" >
  7. </RelativeLayout>

复制代码

3、然后是欢迎界面的布局界面,activity_welcome:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical"
  6. android:background="@drawable/welcome_background">
  7. </LinearLayout>

复制代码

4、最后是主界面的布局,activity_main:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content" >
  5. <TextView
  6. android:id="@+id/textView1"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentLeft="true"
  10. android:layout_alignParentTop="true"
  11. android:text="欢迎来到主页面!"
  12. android:textSize="25sp"/>
  13. </RelativeLayout>

复制代码

5、在这里还要创建一个xml文件来实现自定义按钮的效果,关于自定义按钮的效果实现我会在后面的文章中专题详细介绍,这里就不在赘述start_btn.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:state_enabled="true" android:state_pressed="true"
  4. android:drawable="@drawable/login_button_select" /> <!--按下时的效果-->
  5. <item android:state_enabled="true" android:drawable="@drawable/login_button" />  <!--正常状态的效果-->
  6. </selector>

复制代码

6、布局界面已经讲解完毕,接下来让我们进行详细的代码讲解,ViewPager适配器代码,ViewPagerAdapter.java:

  1. package com.yangyu.myguideview04;
  2. import java.util.ArrayList;
  3. import android.support.v4.view.PagerAdapter;
  4. import android.support.v4.view.ViewPager;
  5. import android.view.View;
  6. /**
  7. * @author yangyu
  8. *        功能描述:ViewPager适配器,用来绑定数据和view
  9. */
  10. public class ViewPagerAdapter extends PagerAdapter {
  11. //界面列表
  12. private ArrayList<View> views;
  13. public ViewPagerAdapter (ArrayList<View> views){
  14. this.views = views;
  15. }
  16. /**
  17. * 获得当前界面数
  18. */
  19. @Override
  20. public int getCount() {
  21. if (views != null) {
  22. return views.size();
  23. }
  24. return 0;
  25. }
  26. /**
  27. * 初始化position位置的界面
  28. */
  29. @Override
  30. public Object instantiateItem(View view, int position) {
  31. ((ViewPager) view).addView(views.get(position), 0);
  32. return views.get(position);
  33. }
  34. /**
  35. * 判断是否由对象生成界面
  36. */
  37. @Override
  38. public boolean isViewFromObject(View view, Object arg1) {
  39. return (view == arg1);
  40. }
  41. /**
  42. * 销毁position位置的界面
  43. */
  44. @Override
  45. public void destroyItem(View view, int position, Object arg2) {
  46. ((ViewPager) view).removeView(views.get(position));
  47. }
  48. }

复制代码

7、引导界面Activity,GuideActivity.java:

  1. package com.yangyu.myguideview04;
  2. import java.util.ArrayList;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.support.v4.view.ViewPager;
  7. import android.support.v4.view.ViewPager.OnPageChangeListener;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. /**
  13. * @author yangyu
  14. *  功能描述:引导界面activity类
  15. */
  16. public class GuideActivity extends Activity implements OnPageChangeListener{
  17. // 定义ViewPager对象
  18. private ViewPager viewPager;
  19. // 定义ViewPager适配器
  20. private ViewPagerAdapter vpAdapter;
  21. // 定义一个ArrayList来存放View
  22. private ArrayList<View> views;
  23. // 定义各个界面View对象
  24. private View view1, view2, view3, view4;
  25. //定义开始按钮对象
  26. private Button startBt;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_guide);
  31. initView();
  32. initData();
  33. }
  34. /**
  35. * 初始化组件
  36. */
  37. private void initView() {
  38. //实例化各个界面的布局对象
  39. LayoutInflater mLi = LayoutInflater.from(this);
  40. view1 = mLi.inflate(R.layout.guide_view01, null);
  41. view2 = mLi.inflate(R.layout.guide_view02, null);
  42. view3 = mLi.inflate(R.layout.guide_view03, null);
  43. view4 = mLi.inflate(R.layout.guide_view04, null);
  44. // 实例化ViewPager
  45. viewPager = (ViewPager) findViewById(R.id.viewpager);
  46. // 实例化ArrayList对象
  47. views = new ArrayList<View>();
  48. // 实例化ViewPager适配器
  49. vpAdapter = new ViewPagerAdapter(views);
  50. //实例化开始按钮
  51. startBt = (Button) view4.findViewById(R.id.startBtn);
  52. }
  53. /**
  54. * 初始化数据
  55. */
  56. private void initData() {
  57. // 设置监听
  58. viewPager.setOnPageChangeListener(this);
  59. // 设置适配器数据
  60. viewPager.setAdapter(vpAdapter);
  61. //将要分页显示的View装入数组中
  62. views.add(view1);
  63. views.add(view2);
  64. views.add(view3);
  65. views.add(view4);
  66. // 给开始按钮设置监听
  67. startBt.setOnClickListener(new OnClickListener() {
  68. @Override
  69. public void onClick(View v) {
  70. startbutton();
  71. }
  72. });
  73. }
  74. @Override
  75. public void onPageScrollStateChanged(int arg0) {
  76. }
  77. @Override
  78. public void onPageScrolled(int arg0, float arg1, int arg2) {
  79. }
  80. @Override
  81. public void onPageSelected(int arg0) {
  82. }
  83. /**
  84. * 相应按钮点击事件
  85. */
  86. private void startbutton() {
  87. Intent intent = new Intent();
  88. intent.setClass(GuideActivity.this,MainActivity.class);
  89. startActivity(intent);
  90. this.finish();
  91. }

复制代码

8、欢迎界面Activity,Welcome.java:

  1. package com.yangyu.myguideview04;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.content.SharedPreferences;
  5. import android.content.SharedPreferences.Editor;
  6. import android.os.Bundle;
  7. /**
  8. * @author yangyu
  9. *  功能描述:欢迎界面
  10. */
  11. public class Welcome extends Activity implements Runnable {
  12. //是否是第一次使用
  13. private boolean isFirstUse;
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_welcome);
  17. /**
  18. * 启动一个延迟线程
  19. */
  20. new Thread(this).start();
  21. }
  22. public void run() {
  23. try {
  24. /**
  25. * 延迟两秒时间
  26. */
  27. Thread.sleep(2000);
  28. //读取SharedPreferences中需要的数据
  29. SharedPreferences preferences = getSharedPreferences("isFirstUse",MODE_WORLD_READABLE);
  30. isFirstUse = preferences.getBoolean("isFirstUse", true);
  31. /**
  32. *如果用户不是第一次使用则直接调转到显示界面,否则调转到引导界面
  33. */
  34. if (isFirstUse) {
  35. startActivity(new Intent(Welcome.this, GuideActivity.class));
  36. } else {
  37. startActivity(new Intent(Welcome.this, MainActivity.class));
  38. }
  39. finish();
  40. //实例化Editor对象
  41. Editor editor = preferences.edit();
  42. //存入数据
  43. editor.putBoolean("isFirstUse", false);
  44. //提交修改
  45. editor.commit();
  46. } catch (InterruptedException e) {
  47. }
  48. }
  49. }

复制代码

在欢迎界面中使用了SharedPreferences来读取用户的信息,判断是否是第一次使用程序,这里的isFirstUse可以根据读者的需要换成任意类型,只要给它加一个判断就行了
9、主界面Activity,这里就加载了一个简单的布局文件,读者可以根据需要对该类进行扩展,MainActivity.java:

  1. package com.yangyu.myguideview04;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. /**
  5. * @author yangyu
  6. *   功能描述:主程序入口类页面
  7. */
  8. public class MainActivity extends Activity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. }
  14. }

复制代码

引导界面的专题就告一段落了,接下来会以主页面的UI设计为专题进行详细的实战讲解,希望大家能继续关注该系列文章。
 MyGuideView04.zip (1.9 MB, 下载次数: 1323)

评分

参与人数 1 下载豆 +10 收起理由
 jnhoodlum + 10 安卓巴士感谢您的分享!

查看全部评分

【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面的更多相关文章

  1. 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar

    原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...

  2. 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面

    大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...

  3. 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面

    本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载 ...

  4. 【Android UI设计与开发】第01期:引导界面(一)ViewPager介绍和使用详解

    做Android开发加起来差不多也有一年多的时间了,总是想写点自己在开发中的心得体会与大家一起交流分享.共同进步,刚开始写也不知该如何下手,仔细想了一下,既然是刚开始写,那就从一个软件给人最直观的感受 ...

  5. 【转】【Android UI设计与开发】第07期:底部菜单栏(二)Fragment的详细介绍和使用方法

    原始地址:http://blog.csdn.net/yangyu20121224/article/category/1431917/1 由于TabActivity在Android4.0以后已经被完全弃 ...

  6. 【Android UI设计与开发】第03期:引导界面(三)仿微信引导界面以及动画效果

    基于前两篇比较简单的实例做铺垫之后,这一篇我们来实现一个稍微复杂一点的引导界面的效果,当然也只是稍微复杂了一点,对于会的人来说当然还是so easy!正所谓会者不难,难者不会,大概说的就是这个意思了吧 ...

  7. 【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻底部弹出菜单

    前一篇文章中有用到 PopupWindow 来实现弹窗的功能.简单介绍以下吧. 官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图.出现的弹出窗口是一个浮动容器的当前活动. 1.首先来 ...

  8. 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面

    这一篇我将会以人人网的引导界面为实例来展开详细的讲解,人人网的引导界面比较的新颖,不同于其他应用程序千篇一律的靠滑动来引导用户,而是以一个一个比较生动形象的动画效果展示在用户们的面前,有一种给人眼前一 ...

  9. 【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例

    通过上一篇文章的讲解,相信大家对于开源项目SlidingMenu都有了一个比较初步的了解(不了解的可以参考上 一篇文章),那么从这一章开始,博主将会以SlidingMenu为重心,给大家带来非常丰富的 ...

随机推荐

  1. IOS开发-属性动画和关键帧动画的使用

    CAMediaTiming是一个协议(protocol),CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类. 继承关系: CoreAnmiation 核心动画 简写CA ...

  2. 【转】贾扬清:希望Caffe成为深度学习领域的Hadoop

    [转:http://www.csdn.net/article/2015-07-07/2825150] 在深度学习(Deep Learning)的热潮下,Caffe作为一个高效.实用的深度学习框架受到了 ...

  3. js 字符串截取

    substr方法: text.substr(start[,length]); text:要提取子字符串的字符串或String对象.必选 start:子字符串的起始位置.以0开始索引.必选 length ...

  4. centos之Haproxy 负载均衡学习笔记

    HAProxy的特点是:1.支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机:2.能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作3.支持url检测后端的 ...

  5. Python基础篇【第8篇】: Socket编程 (一)

    Python Socket 官方关于 Socket 的函数请看 http://docs.python.org/library/socket.html 一.socket介绍 在网络编程中的一个基本组件就 ...

  6. shell基础

    1.显示当前登录linux系统的用户 2.当用户登录到linux系统后,一旦出现提示符时,便可以输入操作命令了.命令可以分为如下两类: (1).bash内置的命令: (2).应用程序. 怎么知道哪些指 ...

  7. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  8. Android开发--布局

    一:LinearLayout  1.线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上.每一个LinearLayout里面又可分为垂直布局(android:orie ...

  9. dll 导出函数名的那些事

    dll 导出函数名的那些事 关键字: VC++  DLL  导出函数 经常使用VC6的Dependency或者是Depends工具查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导 ...

  10. Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

    本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.   ...