Android记录4--自定义ToggleButton+用SharedPreferences保存用户配置

很多应用都会有用户设置,用户的一些偏好可以由用户来决定那是应用人性化的体现,在实际开发中很多情况都作成可配置的了,本篇博客要介绍的是一个比较炫的状态按钮切换,我想很多开发者都想做出这样的效果,在这里我也就把自己参与的项目当中的这部分实现,做出Demo来于朋友们分享。

没有图,我感觉就特别不舒服:

这样看没办法看出效果,如果能做出动态图就好了,下次吧。

除了ToggleButton的自定义之外,用户配置的信息也是要保存起来的,每一次启动程序的时候要能保证使用的是之前的配置,而不是默认配置,在这里使用SharedPreferences是最好的选择了。

想要源码的猛戳这里:http://download.csdn.net/detail/wwj_748/5945829

布局文件:

/2013.08.14_ToggleButton_demo/res/layout/settings.xml

[html] view plaincopy

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/LinearLayout1"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@drawable/bg"
  6. android:orientation="vertical" >
  7. <RelativeLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:background="@drawable/banner_bg" >
  11. <TextView
  12. android:id="@+id/tv_Title"
  13. android:layout_width="wrap_content"
  14. android:layout_height="42dp"
  15. android:layout_centerHorizontal="true"
  16. android:gravity="center"
  17. android:text="设置"
  18. android:textColor="#ffffff"
  19. android:textSize="22sp" />
  20. </RelativeLayout>
  21. <ScrollView
  22. android:layout_width="match_parent"
  23. android:layout_height="match_parent" >
  24. <LinearLayout
  25. android:layout_width="match_parent"
  26. android:layout_height="wrap_content"
  27. android:orientation="vertical" >
  28. <LinearLayout
  29. android:id="@+id/layout_AutoPlay"
  30. android:layout_width="match_parent"
  31. android:layout_height="wrap_content"
  32. android:background="@drawable/item_short_bg_selector"
  33. android:gravity="center_vertical" >
  34. <TextView
  35. android:id="@+id/tv_AutoPlay"
  36. android:layout_width="0dp"
  37. android:layout_height="wrap_content"
  38. android:layout_marginLeft="10dp"
  39. android:layout_weight="1"
  40. android:focusable="false"
  41. android:singleLine="true"
  42. android:text="自动播放"
  43. android:textColor="#7a6f66"
  44. android:textSize="18sp" />
  45. <RelativeLayout
  46. android:layout_width="wrap_content"
  47. android:layout_height="wrap_content"
  48. android:layout_marginRight="10dp" >
  49. <ToggleButton
  50. android:id="@+id/toggle_AutoPlay"
  51. android:layout_width="wrap_content"
  52. android:layout_height="wrap_content"
  53. android:background="@drawable/toggle_selector"
  54. android:gravity="left|center_vertical"
  55. android:paddingLeft="14dp"
  56. android:paddingRight="14dp"
  57. android:textColor="#ffffff"
  58. android:textOff="OFF"
  59. android:textOn="ON" />
  60. <ImageButton
  61. android:id="@+id/toggleButton_AutoPlay"
  62. android:layout_width="wrap_content"
  63. android:layout_height="wrap_content"
  64. android:layout_alignRight="@+id/toggle_AutoPlay"
  65. android:background="#00000000"
  66. android:src="@drawable/progress_thumb_selector" />
  67. </RelativeLayout>
  68. </LinearLayout>
  69. <ImageView
  70. android:layout_width="match_parent"
  71. android:layout_height="wrap_content"
  72. android:scaleType="fitXY"
  73. android:src="@drawable/list_divider" />
  74. <LinearLayout
  75. android:id="@+id/layout_StartOnBoot"
  76. android:layout_width="match_parent"
  77. android:layout_height="wrap_content"
  78. android:background="@drawable/item_short_bg_selector"
  79. android:gravity="center_vertical" >
  80. <TextView
  81. android:id="@+id/tv_StartOnBoot"
  82. android:layout_width="0dp"
  83. android:layout_height="wrap_content"
  84. android:layout_marginLeft="10dp"
  85. android:layout_weight="1"
  86. android:focusable="false"
  87. android:singleLine="true"
  88. android:text="开机自启动"
  89. android:textColor="#7a6f66"
  90. android:textSize="18sp" />
  91. <RelativeLayout
  92. android:layout_width="wrap_content"
  93. android:layout_height="wrap_content"
  94. android:layout_marginRight="10dp" >
  95. <ToggleButton
  96. android:id="@+id/toggle_StartOnBoot"
  97. android:layout_width="wrap_content"
  98. android:layout_height="wrap_content"
  99. android:background="@drawable/toggle_selector"
  100. android:gravity="left|center_vertical"
  101. android:paddingLeft="14dp"
  102. android:paddingRight="14dp"
  103. android:textColor="#ffffff"
  104. android:textOff="OFF"
  105. android:textOn="ON" />
  106. <ImageButton
  107. android:id="@+id/toggleButton_StartOnBoot"
  108. android:layout_width="wrap_content"
  109. android:layout_height="wrap_content"
  110. android:layout_alignRight="@+id/toggle_StartOnBoot"
  111. android:background="#00000000"
  112. android:src="@drawable/progress_thumb_selector" />
  113. </RelativeLayout>
  114. </LinearLayout>
  115. </LinearLayout>
  116. </ScrollView>
  117. </LinearLayout>

哪些selector文件的代码就不贴了,自己看源码吧

Activity文件

/2013.08.14_ToggleButton_demo/src/com/wwj/toggle/Setting.java

[java] view plaincopy

  1. package com.wwj.toggle;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.Gravity;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.ImageButton;
  8. import android.widget.LinearLayout;
  9. import android.widget.RelativeLayout;
  10. import android.widget.ToggleButton;
  11. /**
  12. * 自定义ToggleButton的例子
  13. *
  14. * @author wwj 2013年8月14
  15. */
  16. public class Setting extends Activity {
  17. private LinearLayout layout_AutoPlay;
  18. private LinearLayout layout_StartOnBoot;
  19. private ToggleButton toggle_AutoPlay;
  20. private ToggleButton toggle_StartOnBoot;
  21. private ImageButton toggleButton_AutoPlay;
  22. private ImageButton toggleButton_StartOnBoot;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.settings);
  27. // 找到控件
  28. layout_AutoPlay = (LinearLayout) findViewById(R.id.layout_AutoPlay);
  29. layout_StartOnBoot = (LinearLayout) findViewById(R.id.layout_StartOnBoot);
  30. toggle_AutoPlay = (ToggleButton) findViewById(R.id.toggle_AutoPlay);
  31. toggle_StartOnBoot = (ToggleButton) findViewById(R.id.toggle_StartOnBoot);
  32. toggleButton_AutoPlay = (ImageButton) findViewById(R.id.toggleButton_AutoPlay);
  33. toggleButton_StartOnBoot = (ImageButton) findViewById(R.id.toggleButton_StartOnBoot);
  34. initViews();
  35. setListeners();
  36. }
  37. private void initViews() {
  38. // 是否自动播放,获取SharePerference保存的用户配置
  39. boolean isAutoPlay = SettingUtils.get(this, SettingUtils.AUTO_PLAY,
  40. false);
  41. toggle_AutoPlay.setChecked(isAutoPlay);
  42. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) toggleButton_AutoPlay
  43. .getLayoutParams();
  44. if (isAutoPlay) { // 如果是自动播放
  45. // 调整位置
  46. params.addRule(RelativeLayout.ALIGN_RIGHT, -1);
  47. params.addRule(RelativeLayout.ALIGN_LEFT,
  48. R.id.toggleButton_AutoPlay);
  49. toggleButton_AutoPlay.setLayoutParams(params);
  50. toggleButton_AutoPlay
  51. .setImageResource(R.drawable.progress_thumb_selector);
  52. toggle_AutoPlay.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
  53. } else {
  54. // 调整位置
  55. params.addRule(RelativeLayout.ALIGN_RIGHT, R.id.toggle_AutoPlay);
  56. params.addRule(RelativeLayout.ALIGN_LEFT, -1);
  57. toggleButton_AutoPlay.setLayoutParams(params);
  58. toggleButton_AutoPlay
  59. .setImageResource(R.drawable.progress_thumb_off_selector);
  60. toggle_AutoPlay.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
  61. }
  62. boolean isAutostart = SettingUtils.get(this,
  63. SettingUtils.IS_AUTO_START, true);
  64. toggle_StartOnBoot.setChecked(isAutostart);
  65. RelativeLayout.LayoutParams params3 = (RelativeLayout.LayoutParams) toggleButton_StartOnBoot
  66. .getLayoutParams();
  67. if (isAutostart) {
  68. // 调整位置
  69. params3.addRule(RelativeLayout.ALIGN_RIGHT, -1);
  70. params3.addRule(RelativeLayout.ALIGN_LEFT, R.id.toggle_StartOnBoot);
  71. toggleButton_StartOnBoot.setLayoutParams(params3);
  72. toggleButton_StartOnBoot
  73. .setImageResource(R.drawable.progress_thumb_selector);
  74. toggle_StartOnBoot.setGravity(Gravity.RIGHT
  75. | Gravity.CENTER_VERTICAL);
  76. } else {
  77. // 调整位置
  78. params3.addRule(RelativeLayout.ALIGN_RIGHT, R.id.toggle_StartOnBoot);
  79. params3.addRule(RelativeLayout.ALIGN_LEFT, -1);
  80. toggleButton_StartOnBoot.setLayoutParams(params3);
  81. toggleButton_StartOnBoot
  82. .setImageResource(R.drawable.progress_thumb_off_selector);
  83. toggle_StartOnBoot.setGravity(Gravity.LEFT
  84. | Gravity.CENTER_VERTICAL);
  85. }
  86. }
  87. private void setListeners() {
  88. toggle_AutoPlay.setOnCheckedChangeListener(new ToggleListener(this,
  89. "自动播放", toggle_AutoPlay, toggleButton_AutoPlay));
  90. toggle_StartOnBoot.setOnCheckedChangeListener(new ToggleListener(this,
  91. "开机自启动", toggle_StartOnBoot, toggleButton_StartOnBoot));
  92. // UI事件,按钮点击事件
  93. OnClickListener clickToToggleListener = new OnClickListener() {
  94. @Override
  95. public void onClick(View v) {
  96. toggle_AutoPlay.toggle();
  97. }
  98. };
  99. toggleButton_AutoPlay.setOnClickListener(clickToToggleListener);
  100. layout_AutoPlay.setOnClickListener(clickToToggleListener);
  101. // UI事件,按钮点击事件
  102. OnClickListener clickToToggleAutostartListener = new OnClickListener() {
  103. public void onClick(View v) {
  104. toggle_StartOnBoot.toggle();
  105. }
  106. };
  107. toggleButton_StartOnBoot
  108. .setOnClickListener(clickToToggleAutostartListener);
  109. layout_StartOnBoot
  110. .setOnClickListener(clickToToggleAutostartListener);
  111. }
  112. }

工具类:

/2013.08.14_ToggleButton_demo/src/com/wwj/toggle/SettingUtils.java

[java] view plaincopy

  1. package com.wwj.toggle;
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import android.content.SharedPreferences.Editor;
  5. import android.preference.PreferenceManager;
  6. public class SettingUtils {
  7. public static final String AUTO_PLAY = "auto_play"; // 自动播放
  8. public static final String IS_AUTO_START = "is_auto_start"; // 开机自启动
  9. /**
  10. * 获取配置
  11. * @param context
  12. * @param name
  13. * @param defaultValue
  14. * @return
  15. */
  16. public static boolean get(Context context, String name, boolean defaultValue) {
  17. final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
  18. boolean value = prefs.getBoolean(name, defaultValue);
  19. return value;
  20. }
  21. /**
  22. * 保存用户配置
  23. * @param context
  24. * @param name
  25. * @param value
  26. * @return
  27. */
  28. public static boolean set(Context context, String name, boolean value) {
  29. final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
  30. Editor editor = prefs.edit();
  31. editor.putBoolean(name, value);
  32. return editor.commit(); //提交
  33. }
  34. }

/2013.08.14_ToggleButton_demo/src/com/wwj/toggle/DisplayUtils.java

[java] view plaincopy

  1. package com.wwj.toggle;
  2. import android.content.Context;
  3. public class DisplayUtils {
  4. public static int dip2px(Context context, float dpValue) {
  5. final float scale = context.getResources().getDisplayMetrics().density;
  6. return (int) (dpValue * scale + 0.5f);
  7. }
  8. public static int px2dip(Context context, float pxValue) {
  9. final float scale = context.getResources().getDisplayMetrics().density;
  10. return (int) (pxValue / scale + 0.5f);
  11. }
  12. public static int getScreenWidth(Context context) {
  13. return context.getResources().getDisplayMetrics().widthPixels;
  14. }
  15. public static int getScreenHeight(Context context) {
  16. return context.getResources().getDisplayMetrics().heightPixels;
  17. }
  18. }

/2013.08.14_ToggleButton_demo/src/com/wwj/toggle/ToggleListener.java

[java] view plaincopy

  1. package com.wwj.toggle;
  2. import android.content.Context;
  3. import android.view.Gravity;
  4. import android.view.animation.TranslateAnimation;
  5. import android.widget.CompoundButton;
  6. import android.widget.CompoundButton.OnCheckedChangeListener;
  7. import android.widget.ImageButton;
  8. import android.widget.RelativeLayout;
  9. import android.widget.ToggleButton;
  10. /**
  11. * 状态按钮的监听事件
  12. *
  13. * @author wwj
  14. *
  15. */
  16. public class ToggleListener implements OnCheckedChangeListener {
  17. private Context context;
  18. private String settingName;
  19. private ToggleButton toggle;
  20. private ImageButton toggle_Button;
  21. public ToggleListener(Context context, String settingName,
  22. ToggleButton toggle, ImageButton toggle_Button) {
  23. this.context = context;
  24. this.settingName = settingName;
  25. this.toggle = toggle;
  26. this.toggle_Button = toggle_Button;
  27. }
  28. @Override
  29. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  30. // 保存设置
  31. if ("自动播放".equals(settingName)) {
  32. SettingUtils.set(context, SettingUtils.AUTO_PLAY, isChecked);
  33. } else if ("开机自启动".equals(settingName)) {
  34. SettingUtils.set(context, SettingUtils.IS_AUTO_START, isChecked);
  35. }
  36. // 播放动画
  37. RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) toggle_Button
  38. .getLayoutParams();
  39. if (isChecked) {
  40. // 调整位置
  41. params.addRule(RelativeLayout.ALIGN_RIGHT, -1);
  42. if ("自动播放".equals(settingName)) {
  43. params.addRule(RelativeLayout.ALIGN_LEFT, R.id.toggle_AutoPlay);
  44. } else if ("开机自启动".equals(settingName)) {
  45. params.addRule(RelativeLayout.ALIGN_LEFT,
  46. R.id.toggle_StartOnBoot);
  47. }
  48. toggle_Button.setLayoutParams(params);
  49. toggle_Button.setImageResource(R.drawable.progress_thumb_selector);
  50. toggle.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
  51. // 播放动画
  52. TranslateAnimation animation = new TranslateAnimation(
  53. DisplayUtils.dip2px(context, 40), 0, 0, 0);
  54. animation.setDuration(200);
  55. toggle_Button.startAnimation(animation);
  56. } else {
  57. // 调整位置
  58. if ("自动播放".equals(settingName)) {
  59. params.addRule(RelativeLayout.ALIGN_RIGHT, R.id.toggle_AutoPlay);
  60. } else if ("开机自启动".equals(settingName)) {
  61. params.addRule(RelativeLayout.ALIGN_RIGHT,
  62. R.id.toggle_StartOnBoot);
  63. }
  64. params.addRule(RelativeLayout.ALIGN_LEFT, -1);
  65. toggle_Button.setLayoutParams(params);
  66. toggle_Button
  67. .setImageResource(R.drawable.progress_thumb_off_selector);
  68. toggle.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
  69. // 播放动画
  70. TranslateAnimation animation = new TranslateAnimation(
  71. DisplayUtils.dip2px(context, -40), 0, 0, 0);
  72. animation.setDuration(200);
  73. toggle_Button.startAnimation(animation);
  74. }
  75. }
  76. }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 10:01:54

Android记录4--自定义ToggleButton+用SharedPreferences保存用户配置的相关文章

Android 自定义ToggleButton+用SharedPreferences保存用户配置

布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@dr

Android之使用SharedPreferences保存用户偏好参数

在Android应用中,我们常需要记录用户设置的一些偏好参数,,此时我们就需要用SharedPreferences和Editor将这些信息保存下来,在下次登录时读取. SharedPreferences保存的数据主要类似于配置信息格式的数据,因此它保存数据的形式为key-value对,下面我们来看下实例代码. 首先是界面布局,比较简单,就是一个普通的登陆界面. 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/r

数据类操作之SharedPreferences(保存用户偏好参数)

(一)概述 本节给大家介绍的是第二种存储用户数据的方式,使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties属性文件与xml文件来保存软件的配置信息;而

SharedPreferences保存用户偏好参数

package com.example.administrator.myapplication; import android.content.Context; import android.content.SharedPreferences; /** * Created by Administrator on 2016/5/7 0007. */ public class BrowserSP { private Context context; private SharedPreferences

Servlet之保存用户偏好设置简单功能的实现

写在前面: 先来陈述一下为什么会有这样一个需求和这篇博文. 这是公司的一个项目,我们负责前端,后台服务由其他公司负责.该系统有一个系统偏好设置模块,用户可以设置系统的背景图片等系统样式,因为这是一个比较简单的功能,所以当时没有让后台公司来实现,由自己公司的一个领导编写了一个Servlet.但是由于服务器故障被格式化之后,这个Servlet就丢失了.本来打算跟领导汇报的,但是又怕挨批评,而且这个功能也并不复杂,所以决定自己实现一下吧.但是作为一个对Java一点都不懂的我来说,还是废了不少功夫的,所

【Android实战】记录自学自定义GifView过程,能同时支持gif和其他图片!【实用篇】

之前写了一篇博客,<[Android实战]记录自学自定义GifView过程,详解属性那些事![学习篇]> 关于自定义GifView的,详细讲解了学习过程及遇到的一些类的解释,然后完成了一个项目,能通过在xml加入自定义 view (MyGifView)中加入自定义属性(my:gif_src = "@drawable/coffee"),达到播放gif图片的效果. 但是,有几个问题 1.gif_src 属性只支持 gif 图,并不支持其他类型的图片 2.只支持默认的引用图片,不

Android中利用SharedPreferences保存信息

package com.example.sharepreferen; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.vi

Android使用SharedPreferences保存对象

核心原理: 对象序列化 步骤 1.要保存的对象实现序列化Serializable 2.将序列化的对象保存String(本文的做法是保存为byte数组在转为16进制的String类型保存起来) 3.将保存的String反序列化为对象 下面是完整代码 步骤1.要保存的对象实现序列化Serializable public class Sertest implements Serializable{ private String name; private int age; } 步骤2.将序列化的对象保

Android - 保存用户首次使用状态(SharedPreferences)

保存用户首次使用状态(SharedPreferences) 本文地址: http://blog.csdn.net/caroline_wendy 用户首次登陆时, 可能需要用户教育, 讲解界面操作, 但是不应该在以后的登陆中, 继续显示, 则需要记录用户的登陆状态; 可以使用SharedPreferences进行记录. 在库中, 可以使用封装的PreferenceUtils类库, 使用方法如下: boolean hasShown = PreferenceUtils.get(this, FIRST_