Android自定义SeekBarPreference

由于系统自带的Preference只支持CheckBoxPreferenceListPreferenceeditPreference等几种偏好选项,假如我们需要在Preference中添加SeekBar来实现一个音量控制条的功能,这时候就需要自定义一个类.

这里我们通过继承DialogPreference来实现.

首先定义一个xml布局文件来描述seekbar的布局

seek.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content" ><TextViewandroid:id="@+id/text1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:text="111" /><TextViewandroid:id="@+id/text2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="222" /></RelativeLayout><SeekBarandroid:id="@+id/seekbar1"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/text3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="333" /></LinearLayout>接着我们需要定义2个seekbar的属性,minValue和maxValue来分别描述进度条的最小值和最大值.

我们知道自定义控件的属性需要在attrs.xml中声明:

<?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="com.example.dialogpreferencesseekbar.SeekBarPreferences"><attr name="minValue" format="integer" /><attr name="maxValue" format="integer" /></declare-styleable></resources>再来看看我们自定义SeekBarPreference继承于DialogPreference的类SeekBarPreferences.java:

package com.example.dialogpreferencesseekbar;import android.content.Context;import android.content.res.TypedArray;import android.preference.DialogPreference;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;import android.widget.TextView;public class SeekBarPreferences extends DialogPreference implementsOnSeekBarChangeListener {private static final String PREFERENCE_NS = "";private static final String ANDROID_NS = "";private static final String ATTR_DEFAULT_VALUE = "defaultValue";private static final String ATTR_MIN_VALUE = "minValue";private static final String ATTR_MAX_VALUE = "maxValue";private int mMinValue;private int mMaxValue;private int mDefaultValue;private int mCurrentValue;private SeekBar mSeekBar;private TextView mValueText;public SeekBarPreferences(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubmMinValue = attrs.getAttributeIntValue(PREFERENCE_NS, ATTR_MIN_VALUE, 0);mMaxValue = attrs.getAttributeIntValue(PREFERENCE_NS, ATTR_MAX_VALUE,100);/********也可以通过Context的obtainStyledAttributes获得自定义的属性值***********///TypedArray array = context.obtainStyledAttributes(attrs,//R.styleable.com_example_dialogpreferencesseekbar_SeekBarPreferences);//mMaxValue = array.getInteger(R.styleable.com_example_dialogpreferencesseekbar_SeekBarPreferences_maxValue, 100);//mMinValue = array.getInteger(R.styleable.com_example_dialogpreferencesseekbar_SeekBarPreferences_minValue, 0);mDefaultValue = attrs.getAttributeIntValue(ANDROID_NS,ATTR_DEFAULT_VALUE, 50);//array.recycle();}@Overrideprotected View onCreateDialogView() {// TODO Auto-generated method stub// Get current value from settingsmCurrentValue = getPersistedInt(mDefaultValue);// Inflate layoutLayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);View view = inflater.inflate(R.layout.seek, null);// Put minimum and maximum((TextView) view.findViewById(R.id.text1)).setText(Integer.toString(mMinValue));((TextView) view.findViewById(R.id.text2)).setText(Integer.toString(mMaxValue));// Setup SeekBarmSeekBar = (SeekBar) view.findViewById(R.id.seekbar1);mSeekBar.setMax(mMaxValue – mMinValue);mSeekBar.setProgress(mCurrentValue – mMinValue);mSeekBar.setOnSeekBarChangeListener(this);// Put current valuemValueText = (TextView) view.findViewById(R.id.text3);mValueText.setText(Integer.toString(mCurrentValue));return view;}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stubmCurrentValue = progress + mMinValue;mValueText.setText(Integer.toString(mCurrentValue));}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}}

这里包含SeekBar的DialogPreference就自定义好了

这时我们需要定义整个Preference的布局文件了dialog_slider.xml

梦想让我与众不同,奋斗让我改变命运!

Android自定义SeekBarPreference

相关文章:

你感兴趣的文章:

标签云: