设计自己的Android Preference

本文介绍如何自定义SeekBarPreference以实现在Android应用中的功能设置,包括调整SeekBar的进度值,并通过示例展示了如何创建ColorPickerPreference来选取颜色。

设计自己的Android Preference

SeekBar Preference

SeekBar Preference

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

Color Picker Preference

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

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

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

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

<net.poemcode.android.config.SeekBarPreference


	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
(
)
;

    }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值