`

编写自定义的 Android Preference 组件

阅读更多

Android SDK 提供好几个 Preference 组件,例如 CheckBoxPreference、EditTextPreference、DialogPreference、ListPreference 等,这些组件是跟 Android 提供的 Preference 存储机制绑定的,你可以通过这些组件来修改应用的一些配置,如下图所示,这是 Android 自带的系统设置界面:

 

但这些组件毕竟还不能满足100%的要求,假设我们需要为应用程序提供一个选择不同图片做为应用背景图的设置,我们需要一个很直观的就可以看到当前 所选择的图片,然后点击后可以浏览其他图片并选择。那么这些 Preference 就无法满足这个需求,因此我们需要对 Preference 进行扩展,下图是扩展后的效果:

请看中间选项的效果,在右边显示当前选择的图片。

代码如下:

 

  1. import  android.content.Context;  
  2. import  android.content.Intent;  
  3. import  android.os.Bundle;  
  4. import  android.preference.Preference;  
  5. import  android.preference.PreferenceActivity;  
  6. import  android.util.AttributeSet;  
  7. import  android.view.View;  
  8. import  android.widget.ImageView;  
  9.   
  10. /**  
  11.  * 图片选项,用于设置图片和边框  
  12.  * @author Winter Lau  
  13.  */   
  14. public   class  ImageOptionPreference  extends  Preference {  
  15.   
  16.     private  PreferenceActivity parent;  
  17.     private   int  mImage = R.drawable.car;  
  18.     private  ImageView preview_img;  
  19.       
  20.     public  ImageOptionPreference(Context context, AttributeSet attrs,  int  defStyle) {  
  21.         super (context, attrs, defStyle);  
  22.     }  
  23.   
  24.     public  ImageOptionPreference(Context context, AttributeSet attrs) {  
  25.         super (context, attrs);  
  26.     }  
  27.   
  28.     public  ImageOptionPreference(Context context) {  
  29.         super (context);  
  30.     }  
  31.       
  32.     void  setActivity(PreferenceActivity parent) {  
  33.         this .parent = parent;  
  34.     }  
  35.       
  36.     @Override   
  37.     public   boolean  isPersistent() {  
  38.         return   false ;  
  39.     }  
  40.   
  41.     /**  
  42.      * 修改图片  
  43.      * @param newImage  
  44.      * @return  
  45.      */   
  46.     boolean  ChangeGamePic( int  newImage ){  
  47.         if ( this .mImage == newImage)  
  48.             return   false ;  
  49.         GameGlobal.save_pic(newImage);  
  50.         this .mImage = newImage;  
  51.         preview_img.setImageResource(newImage);  
  52.         return   true ;  
  53.     }  
  54.   
  55.     @Override   
  56.     protected   void  onBindView(View view) {  
  57.         super .onBindView(view);  
  58.           
  59.         this .mImage = GameGlobal.get_pic();  
  60.         preview_img = (ImageView)view.findViewById(R.id.pref_current_img);  
  61.         preview_img.setImageResource(this .mImage);  
  62.     }     
  63.   
  64.     @Override   
  65.     protected   void  onClick() {  
  66.         super .onClick();  
  67.         Bundle bundle = new  Bundle();  
  68.         bundle.putInt(GameGlobal.PREF_KEY_IMAGE, this .mImage);  
  69.         Intent intent = new  Intent(parent, ImageSelector. class );  
  70.         intent.putExtras(bundle);  
  71.         parent.startActivityForResult(intent, MagicSetting.REQUEST_CODE_GAME_IMAGE);          
  72.     }  
  73.   
  74. }  
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;

/**
 * 图片选项,用于设置图片和边框
 * @author Winter Lau
 */
public class ImageOptionPreference extends Preference {

	private PreferenceActivity parent;
	private int mImage = R.drawable.car;
	private ImageView preview_img;
	
	public ImageOptionPreference(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public ImageOptionPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public ImageOptionPreference(Context context) {
		super(context);
	}
	
	void setActivity(PreferenceActivity parent) {
		this.parent = parent;
	}
	
	@Override
	public boolean isPersistent() {
		return false;
	}

	/**
	 * 修改图片
	 * @param newImage
	 * @return
	 */
	boolean ChangeGamePic(int newImage ){
		if(this.mImage == newImage)
			return false;
		GameGlobal.save_pic(newImage);
		this.mImage = newImage;
		preview_img.setImageResource(newImage);
		return true;
	}

	@Override
	protected void onBindView(View view) {
		super.onBindView(view);
		
		this.mImage = GameGlobal.get_pic();
		preview_img = (ImageView)view.findViewById(R.id.pref_current_img);
		preview_img.setImageResource(this.mImage);
	}	

    @Override
    protected void onClick() {
        super.onClick();
        Bundle bundle = new Bundle();
        bundle.putInt(GameGlobal.PREF_KEY_IMAGE, this.mImage);
        Intent intent = new Intent(parent, ImageSelector.class);
        intent.putExtras(bundle);
        parent.startActivityForResult(intent, MagicSetting.REQUEST_CODE_GAME_IMAGE);        
    }

}
对应的 Perference 配置信息如下

<com.liusoft.android.fmagic.ImageOptionPreference       
        android:key="game_pic"
        android:persistent="false"
        android:title="@string/pref_pic_title"
        android:summary="@string/pref_pic_summary"
        android:widgetLayout="@layout/preference_widget_image"
    />

而 preference_widget_image 的信息如下

<?xml version="1.0" encoding="utf-8"?>

<!-- Layout used by ImageOptionPreference for the image option style.
     This is inflated inside android.R.layout.preference.
     -->
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pref_current_img"
    android:layout_width="54dip"
    android:layout_height="54dip"
    android:layout_marginRight="4dip"
    android:layout_gravity="center_vertical"
    android:focusable="false"
    android:clickable="false"
    android:background="#eeeeee"
    android:padding="2dip"
    />
而这个 ImageView 的 Layout 就是在选项右边显示的图片。

分享到:
评论
1 楼 lyltiger 2011-10-12  
怎么都是这篇文章,有点小错误啊
android:widgetLayout="@layout/preference_widget_image"这里报错

相关推荐

    Preference的使用

    在Android开发中,Preference是用来创建用户界面的一种组件,主要用于实现设置界面。Preference允许开发者轻松地创建可交互的UI元素,如开关、选择器和输入框等,这些元素通常出现在应用程序的设置菜单中。本篇文章...

    android-ColorPickerPreference-master.zip

    在Android中,Preference是用于展示用户可配置设置的组件,而自定义View或Preference则可以满足特定需求,提供更丰富的交互体验。 2. **颜色选择器(ColorPicker)** 项目中的ColorPicker是关键组件,它通常包含一...

    android v7Google最新源码 jar包

    5. **其他组件**: V7库还包含了其他的组件和服务,如Preference-v7库提供了对自定义设置界面的支持,Loader-v7库帮助管理后台数据加载,Fragment-v7库则提供了对早期版本Android中Fragment的支持。 通过研究这个...

    android 仿ios风格的SwitchButton

    总之,实现"android 仿ios风格的SwitchButton"需要结合XML布局、自定义样式、事件监听和可能的自定义Preference类。这不仅提升了应用的视觉一致性,也为用户提供了一种熟悉的操作方式。通过不断优化和调试,可以创造...

    android开发之设置界面的设计

    在Android开发中,设置界面是应用中不可或缺的一部分,它为用户提供了一种自定义应用行为和配置的方式。本实例聚焦于如何设计一个精仿QQ风格的设置界面,这将涉及到多个关键知识点,包括布局管理、控件使用、数据...

    Andriod 自己写的例子

    1. **AndroidPreference**: 这个例子涉及到Android的偏好设置(SharedPreferences)。SharedPreferences提供了一种轻量级的数据存储方式,用于存储简单的键值对数据,如用户设定的应用设置。通过PreferencesScreen...

    busy coders guide to android dev Android教程中文版

    Preference首选项用于管理用户设置,让应用可以根据用户偏好自定义行为。 访问本地文件系统和SQLite数据库是存储数据的常见方式,教程会教授如何读写文件以及如何使用SQLite进行数据持久化。 Content Provider作为...

    Android 设置情景模式源码.zip源码资源下载

    通过研究这个源码资源,开发者可以学习如何在Android应用中实现用户自定义的情景模式设置,以及如何与其他系统组件如广播、服务和通知协同工作。这对于提高用户体验和打造特色应用具有重要意义。

    Android-在设置界面实现将一个颜色选择器

    在Android开发中,创建一个颜色选择器是常见的需求,特别是在设置界面中,用户可能需要自定义界面的主题色或字体颜色。本教程将详细介绍如何在Android的设置界面实现一个颜色选择器。 首先,我们需要理解Android的...

    安卓7.0Settings源码

    2. **Preference**:Settings应用大量使用了Preference类,这是Android中用于创建设置界面的UI组件。Preference包括各种类型的设置项,如开关按钮(SwitchPreference)、选择列表(ListPreference)等。在源码中,...

    android环境搭配详解

    - **Eclipse 3.4**:集成开发环境(IDE),用于编写和调试Android应用程序。 - **Android SDK 1.5**:软件开发工具包,包含了开发Android应用程序所需的工具和库。 #### 三、下载与安装 1. **JDK 1.6** - 下载地址...

    Android-PreferencesManager,首选项管理器是一个开源应用程序,允许您无缝地编辑应用程序的首选项。.zip

    2. **PreferenceScreen**: 在XML布局文件中,`&lt;preference-screen&gt;`元素用于创建一个设置屏幕,而`&lt;preference&gt;`元素则表示具体的设置项。`PreferencesManager`可能包含对这些元素的扩展,以实现自定义的UI和交互。 ...

    SharedPreference.rar

    2. 继承`PreferenceActivity`:自定义一个Activity,让它继承自`PreferenceActivity`。 3. 加载布局:在`onCreate()`方法中,使用`addPreferencesFromResource()`方法加载之前创建的XML布局。 4. 监听用户操作:可以...

    深入浅出Android--Google手持设备应用程序设计

    该书由gasolin编写,主要面向希望深入了解Android开发技术的读者。通过一系列实践案例,本书旨在帮助读者全面掌握Android应用程序的设计与实现。 #### 二、核心知识点概述 1. **Android简介** - **定义与背景**:...

    PreferenceFragment使用方法

    在Android开发中,PreferenceFragment是用于展示用户设置界面的一个关键组件。它允许开发者方便地创建具有各种设置选项的界面,这些选项通常与SharedPreferences对象交互,保存用户的偏好设置。本篇文章将深入探讨...

    MaterialPreference::gear_selector:一个库,旨在用一些漂亮的东西替换Android框架上的默认首选项

    在Android原生的框架中,Preference组件用于构建设置界面,用户可以通过它来更改应用程序的各种设置。然而,原生的Preference组件样式较为传统,可能无法满足现代应用对设计美感的需求。MaterialPreference库就解决...

    android-ColorPickerPreference:用于Android的ColorPickerPreference可以在首选项中创建颜色选择器。 项目创建为图书馆

    在Android开发中,有时我们需要为用户提供自定义颜色选择的功能,比如设置应用主题色或个性化界面颜色等。这时,`ColorPickerPreference`就派上了用场。`android-ColorPickerPreference`是一个开源项目,旨在为...

    PreferenceRoom,更有效地管理Android项目的共享引用。.zip

    3. **LiveData集成**:与Android架构组件兼容,使得偏好设置可以实时更新并响应视图的变化。 4. **减少样板代码**:通过处理器自动生成存取方法,减少了大量重复的代码编写。 5. **更好的调试体验**:由于所有设置都...

    packages_apps_KryptonSettings:设备的自定义页面

    - 自定义设置页面往往涉及到对Android原生`Preference`组件的扩展或自定义View的创建。开发者可以通过继承`Preference`类来创建新的设置项,或者直接继承`View`或`ViewGroup`来设计独特的界面元素。 6. **...

Global site tag (gtag.js) - Google Analytics