【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. JTAG和SWD连接关系图

    经实际测试 SWD最少接线方法: 1.VTref与Vsupply短接 2.JLINK的SWDIO与目标板SWDIO相连 3.JLINK的SWCLK与目标板SWCLK相连 4.JLINK任意一个GND与 ...

  2. U3D外包、Unreal4外包、VR外包就找北京动点飞扬软件

    北京动点软件长年承接Unity3D(U3D外包)项目,我们制作各类型VR/AR游戏,虚拟现实,增强现实项目! 品质保证,售后完备. 联系请加QQ:372900288  电话:13911652504 我 ...

  3. Java事务处理全解析(五)—— Template模式

    在本系列的上一篇文章中,我们讲到了使用TransactionManger和ConnectionHolder完成线程安全的事务管理,在本篇中,我们将在此基础上引入Template模式进行事务管理. Te ...

  4. GDI+系列

    1.GDI+的概述 2.绘图表面 3.GDI+坐标系 4.用Pen对象画图 1.使用GDI+画线 2.使用GDI+画弧线 3.使用GDI+画曲线 4.使用GDI+画椭圆 5.使用GDI+画矩形.多边形 ...

  5. CPS冥想 - 2 手撸控制流

    原博客链接:http://blogs.msdn.com/b/ericlippert/archive/2010/10/22/continuation-passing-style-revisited-pa ...

  6. EF框架 转载

    http://www.cnblogs.com/zrdm/p/5060360.html Model First Model First我们称之为"模型优先",这里的模型指的是&quo ...

  7. List集合中的对象根据属性排序

    集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List中的元素进行排序,该如何实现呢?看 ...

  8. (转)SVN 服务端、客户端安装及配置、导入导出项目

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  9. Flex加载google地图、百度地图以及天地图作底图

    一  Flex加载Google地图作底图 (1)帮助类GoogleLayer.as /* * 根据输入的地图类型加载Google地图(by chenyuming) */ package Layers ...

  10. js实现一套代码来控制所有的运动,图片的淡入淡出,winth,height的变宽

    介绍了那么多运动,這次一套代码实现所有运动 1.html代码和css代码,只是定义一个div <style> div{ width:200px; height:200px; margin: ...