编写自定义的 Android(安卓)Preference 组件
Android SDK 提供好几个 Preference 组件,例如 CheckBoxPreference、EditTextPreference、DialogPreference、ListPreference 等,这些组件是跟 Android 提供的 Preference 存储机制绑定的,你可以通过这些组件来修改应用的一些配置,如下图所示,这是 Android 自带的系统设置界面:
但这些组件毕竟还不能满足100%的要求,假设我们需要为应用程序提供一个选择不同图片做为应用背景图的设置,我们需要一个很直观的就可以看到当前 所选择的图片,然后点击后可以浏览其他图片并选择。那么这些 Preference 就无法满足这个需求,因此我们需要对 Preference 进行扩展,下图是扩展后的效果:
请看中间选项的效果,在右边显示当前选择的图片。
代码如下:
源码 打印 ?- 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;
- /**
- *图片选项,用于设置图片和边框
- *@authorWinterLau
- */
- public class ImageOptionPreference extends Preference{
- private PreferenceActivityparent;
- private int mImage=R.drawable.car;
- private ImageViewpreview_img;
- public ImageOptionPreference(Contextcontext,AttributeSetattrs, int defStyle){
- super (context,attrs,defStyle);
- }
- public ImageOptionPreference(Contextcontext,AttributeSetattrs){
- super (context,attrs);
- }
- public ImageOptionPreference(Contextcontext){
- super (context);
- }
- void setActivity(PreferenceActivityparent){
- this .parent=parent;
- }
- @Override
- public boolean isPersistent(){
- return false ;
- }
- /**
- *修改图片
- *@paramnewImage
- *@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(Viewview){
- 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();
- Bundlebundle=new Bundle();
- bundle.putInt(GameGlobal.PREF_KEY_IMAGE,this .mImage);
- Intentintent=new Intent(parent,ImageSelector. class );
- intent.putExtras(bundle);
- parent.startActivityForResult(intent,MagicSetting.REQUEST_CODE_GAME_IMAGE);
- }
- }
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;}@Overridepublic 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;}@Overrideprotected 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 就是在选项右边显示的图片。
更多相关文章
- 浅谈android的selector背景选择器
- Android(安卓)UI设计——ImageView和ImageButton控件
- Android中的Selector
- Android静态图片人脸识别的完整demo(附完整源码)
- Android菜鸟日记12 Gallery
- android 获取http网络图片保存png
- ImageView的属性大全
- 编写自定义的 Android(安卓)Preference 组件
- android 按钮设计中state_selected属性