PreferenceActivity类

PreferenceActivity类PreferencesA 是 Android 中专门用来实现程序设置界面及参数存储的一个 Activity 我们用一个实例来简介如何使用 PreferencesA 下面是一个设置页面 nbsp 以此为例我们来介绍一下如何实现这个界面 首先建立一个 xml 来描述这个界面 文件为 res xml preferences xmlxmlns android http

PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity,我们用一个实例来简介如何使用PreferencesActivity。
下面是一个设置页面:
PreferenceActivity类

 以此为例我们来介绍一下如何实现这个界面。首先建立一个xml来描述这个界面,文件为res/xml/preferences.xml



xmlns:android=”http://schemas.android.com/apk/res/android”>
      
             


                    android:key=”CheckBox1″
                    android:title=”CheckBox”
                    android:summaryOn=”某功能: 开启”
                    android:summaryOff=”某功能: 关闭”
                    android:defaultValue=”true”
              />
      
      
             
                   


                          android:key=”CheckBox2″
                          android:title=”CheckBox”
                          android:summaryOn=”某功能: 开启”
                          android:summaryOff=”某功能: 关闭”
                          android:defaultValue=”true”
                    />
             
      
      
      
              android:key=”ListPreference”
              android:title=”ListPreference”
              android:summary=”ListPreference测试”
              android:dialogTitle=”ListPreference”
              android:entries=”@array/entries_list_preference”
              android:entryValues=”@array/entriesvalue_list_preference”
      />
      


              android:key=”EditTextPreference”
              android:title=”EditTextPreference”
              android:summary=”点击输入”
              android:dialogTitle=”输入设置”
      />
      


              android:key=”Ri ngtonePr eference”
              android:title=”RingtoneP re ference”
              android: summary=”选择铃声”
      />
      

这个例子中包括了PreferenceActivity中常见的几种组件,以下为具体介绍及用法:
PreferenceScreen: 设置页面,可嵌套形成二级设置页面,用Title参数设置标题,summary设置描述(标题下面的文字),key设置唯一的ID,每个PreferenceScreen内可添加其它元素作为二级设置页面。
PreferenceCategory: 某一类相关的设置,可用Title参数设置标题。
CheckBoxPreference :是一个CheckBox设置,只有两种值,true或false,可用Title参数设置标题sumary设置描述,用summaryOn和summaryOff参数来设置控件选中和未选中时的提示,defaultValue设置默认值。
ListPreference: 下拉框选 择控件,用Title参数设置标题,用Summary参数设置说明,点击后出现下拉框,用dialogTitle 设置下拉框的标题,下拉框内显示的内容和具体的值需要在res/valu es/array.xml中设置两个array来表示。






      

test1

      

test2

      

test3




      

1

      

2

      

3



PreferenceActivity类


EditTextPreference: 输入框控件,点击后可输入字符串设置。用Title参数设置标题,Summary参数设置说明,dialogTitle参数设置输入框的标题。
PreferenceActivity类

RingtonePreference: 铃声选择框,点击后可选择系统铃声。Title参数设置标题,Summary参数设置说明,dialogTitle参数设置铃 声选择框的标题。
PreferenceActivity类


以上是PreferenceActivity的xml描述,那么在程序中我们只需要新建一个继承自PreferenceActivity的 Activity,然后在主程序中调用就可以了。
这个PreferenceActivity中的设置存储是完全自动的,你不需要再用代码去实现设置的存储,PreferenceActivity创建后会自动创建一个配置文件/data/data/you_package_name /shared_prefs/you_package_name_you_xml_name.xml。
上例中自动生成的配置文件如下:








2



content://settings/system/ringtone






要取得其中的值可以通过如下的方法:
SharedPre ferences prefs = PreferenceManager.getDefaultSharedPreferen ces(this);
value = prefs.getString(”ListPreference ”, “unset”);

设计自己的Android Preference




















































SeekBar Preference

PreferenceActivity类
 

Android提供了Preference供应用可以进行功能设置以及属性配置等操作,检查android.preference可以看到 Preference下有若干子类,例如常用的EditTextPreference、CheckBoxPreference、 ListPreference等。但是仅仅有这些是不够的。

在我现在的工作当中,应用里有这么一个场景,用户手指在屏幕滑动,应用绘制出移动的轨迹。

熟悉Android API Demo(可以在SDK/platforms/android-1.5/samples下找到)的人一定记得在graphics目录下,有一个 FingerPaint的类实现了类似上述功能。但是还远远实现不了我们的需要,–需求是要在Preference中实现挑选颜色和调整粗细。

当然,他山之石可以攻玉,FingerPaint还是提供了不错的例子,尤其是FingPaint中选择颜色所使用的另外一个类ColorPickerDialog基本上具备了我们想要的部分功能。

除了上面提到的FingerPaint之外,还可以从Android的源码中找到可以参考的代码。从framework/base/core /java中,找到android.preference包,可以看到有一个SeekBarPreference的类,–这是一个“烂尾”类,代码未完成,因此被Google打上了@hide的标签。因此需要稍加完善,才能加以使用。

@Override

protected void onBindDialogView(View view) {

    super.onBindDialogView(view); 

     bar = (SeekBar) view.findViewById(R.id.seekbar);

     bar.setOnSeekBarChangeListener(this); bar.setProgress(barValue);

         public void setValue(int value) {

                 barValue = value;

           } 

    public int getValue() {

                    return barValue;} 

     @Override

   protected void onDialogClosed(boolean positiveResult) {

              if (positiveResult) { 

                   this.getOnPreferenceChangeListener().onPreferenceChange(this, barValue);

                    }

      }



Color Picker Preference

PreferenceActivity类

 


在这个类的改造过程中,override两个父类方法是关键所在,一个是onBindDialogView,另一个是onDialogClosed。

通过第一个方法,我们可以“找到”被当做content view的SeekBar的实例,进而可以获得到其progress。

通过第二个方法,我们可以方便的通知到Listener,告诉它,SeekBar的值有变化。这里我们把SeekBar的值,即progress看 做是SeekBarPreference的value。除了这两个方法之外,就是要增加setValue和getValue两个方法了。

如果不看代码的话,就会有疑问:SeekBar是如何进入Diglog的呢?它正式通过DialogPreference的属性android:dialogLayout得以注入:


 


                         android:key=”@string/setting_handwrite_width_key”

                         android:title=”@string/setting_handwrite_width_title”

                         android:dialogTitle=”@string/setting_handwrite_width_title”

                         android:dialogLayout=”@layout/setting_widthseekbar”

                         android:persistent=”true”/>


 

依此原理,可以举一反三,对于如何实现选择颜色是不是有了思路?

首先实现一个视图,负责展现不同颜色和接收用户选中的颜色,其可以从SeekBarPreference中的内部类ColorPickerView 加以改造完成;然后新增一个布局文件,将刚才的视图加入到布局当中;接着继承DialogPreference实现自己的Preference子类 ColorPickerPreference;最后在XML文件里增加这个Preference并把刚才的布局文件通过dialogLayout属性加入 进去。从而实现了整个功能。


 

   public class SeekBarPreference extends DialogPreference implements

           SeekBar.OnSeekBarChangeListener {  

              private static final String TAG = “SeekBarPreference”; 

              private SeekBar bar;  private int barValue; 

              public SeekBarPreference(Context context, AttributeSet attrs)

                       super(context, attrs);

                    

@Override

            protected void onBindDialogView(View view) {

                       super.onBindDialogView(view); 

                       bar = (SeekBar) view.findViewById(R.id.seekbar);

                      bar.setOnSeekBarChangeListener(this);

                      bar.setProgress(barValue); } 

            public void setValue(int value) {

                      barValue = value;

           }  

       public int getValue()

           {

              return barValue;

            

   @Override

            protected void onDialogClosed(boolean positiveResult)

               {

                      if (positiveResult)

                           {

                                 this.getOnPreferenceChangeListener().onPreferenceChange(this, barValue);

                          }

              } 

           public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)

                       {

                          Log.d(TAG, “onProgressChanged, progress : “

                                            + progress + “, fromUser : ” + fromUser);

                                 } 

            public void onStartTrackingTouch(SeekBar seekBar)

               {

                       Log.d(TAG, “onStartTrackingTouch”);

              

             public void onStopTrackingTouch(SeekBar seekBar)

                      {

                                 barValue = seekBar.getProgress();

                      }

  }



转自与:http://blog.sina.com.cn/s/blog_5da93c8f0100zfmx.html















































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178918.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:13
下一篇 2026年3月26日 下午4:14


相关推荐

  • docker 镜像导入导出_docker常用镜像

    docker 镜像导入导出_docker常用镜像将本机的镜像导出到压缩包,使用save和load进行导入和导出查看镜像列表dockerimages导出镜像dockersave0fdf2b4c26d3>images.tar同时导出多个dockersave-oimages.tarelastest/etm:2.4.0elastest/etm-jenkins:1.2.0导入镜像dockerload<images.tar…

    2025年9月12日
    6
  • 计算机浮点表示法 教案,计算机组成原理——浮点数表示方法(示例代码)

    计算机浮点表示法 教案,计算机组成原理——浮点数表示方法(示例代码)简介这篇文章主要介绍了计算机组成原理——浮点数表示方法(示例代码)以及相关的经验技巧,文章约568字,浏览量241,点赞数7,值得推荐!为了表示浮点数,数被分为两部分:整数部分和小数部分。例如,浮点数14.234就有整数部分14和小数部分0.234.首先把浮点数转换成二进制数,步骤如下:1把整数部分转换成二进制.2把小数部分转换成二进制.3在两部分之间加上小数点.浮点数还可以规范化,浮点数可以用单…

    2022年6月18日
    31
  • Tomcat调优和JVM优化[通俗易懂]

    Tomcat调优和JVM优化[通俗易懂]Tomcat本身优化工作方式选择为了提升性能,首先就要对代码进行动静分离,让Tomcat只负责jsp文件的解析工作。如采用Apache和Tomcat的整合方式,他们之间的连接方案有三种选择,JK、http_proxy和ajp_proxy。相对于JK的连接方式,后两种在配置上比较简单的,灵活性方面也一点都不逊色。但就稳定性而言不像JK这样久经考验,所以建议…

    2022年6月7日
    36
  • python中modulenotfounderror_esxi安装报错

    python中modulenotfounderror_esxi安装报错1.下载安装包https://www.python.org/ftp/python/该目录下选择所需要的版本进行下载、解压。wgethttps://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgztar-xzvfPython-3.7.1.tgz2.二进制文件安装  1.创建存放目录mkdir/usr/l…

    2025年12月1日
    6
  • Java集合篇:fail-fast机制 与 fail-safe

    Java集合篇:fail-fast机制 与 fail-safe

    2021年10月4日
    47
  • 《前端运维》一、Linux基础–09常用软件安装

    一、软件包管理RPM是RedHatPackageManager(RedHat软件包管理工具)类似Windows里面的"添加/删除程序"。软件包有几种类型,我们一起来看下:源

    2022年3月25日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号