Android系统下的SeekBar太简单,简单到连起止的提示和动态选择后变化的提示都没有。最起码我没找到,所以自己实现了一个扩展的SeekBar,应该好用很多。其效果图如下:



贴上代码:
1、调用的方法举例:
//seek bar preference
ExtSeekBarPreference loPrefHttpRangeSize = new ExtSeekBarPreference(this, null);
loPrefHttpRangeSize.setKey(PREF_KEY_HTTP_RANGE_SIZE);
loPrefHttpRangeSize.setTitle(R.string.CONFIG_TITLE_HTTP_RANGESIZE);
loPrefHttpRangeSize.setPersistent(true);
loPrefHttpRangeSize.setMin(3);
loPrefHttpRangeSize.setMax(20);
loPrefHttpRangeSize.setKeyProgressIncrement(1);
loPrefHttpRangeSize.setUnit("00KB");
loPrefHttpRangeSize.setValue(coGlobalContext.coPrefs.getInt(PREF_KEY_HTTP_RANGE_SIZE, PREF_DEFAULT_HTTP_RANGE_SIZE));
loPrefHttpRangeSize.setSummary(coGlobalContext.coPrefs.getInt(PREF_KEY_HTTP_RANGE_SIZE, PREF_DEFAULT_HTTP_RANGE_SIZE));
loPrefHttpRangeSize.setNegativeButtonText(getResources().getString(R.string.CONFIRM_CANCEL));
loPrefHttpRangeSize.setPositiveButtonText(getResources().getString(R.string.CONFIRM_OK));
dialogBasedPrefCat.addPreference(loPrefHttpRangeSize);

2、扩展的SeekBar类:
public class ExtSeekBarPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener{

private int ciMinVal=0;
private int ciMaxVal=100;
private int ciInitVal=0;
private int ciIncrement=1;
private String csUnit="";
private Context coContext;
private TextView coSeekBarValView=null;
private SeekBar coSeekBar;

public ExtSeekBarPreference(Context aoContext, AttributeSet attrs)
{
super(aoContext, attrs);
this.coContext = aoContext;
}

public int getMin()
{
return ciMinVal;
}

public void setMin(int aiMin)
{
ciMinVal = aiMin;
}

public void setMax(int aiMax)
{
ciMaxVal = aiMax;
}

public void setUnit(String asUnit)
{
csUnit = asUnit;
}

public void setKeyProgressIncrement(int aiIncrement)
{
ciIncrement = aiIncrement;
}

public void setValue(int aiVal)
{
ciInitVal = aiVal;
}

protected void onPrepareDialogBuilder(Builder builder)
{
LayoutInflater factory = LayoutInflater.from(coContext);
View loSeekBarView = factory.inflate(R.layout.view_ext_seekbar, null);
builder.setView(loSeekBarView);

coSeekBar = (SeekBar)loSeekBarView.findViewById(R.id.SeekBarControl);
coSeekBar.setOnSeekBarChangeListener(this);
coSeekBar.setMax(ciMaxVal-ciMinVal);
coSeekBar.setKeyProgressIncrement(ciIncrement);

TextView loMinText = (TextView)loSeekBarView.findViewById(R.id.SeekBarMin);
loMinText.setText(ciMinVal+csUnit);

TextView loMaxText = (TextView)loSeekBarView.findViewById(R.id.SeekBarMax);
loMaxText.setText(ciMaxVal+csUnit);

coSeekBarValView = (TextView)loSeekBarView.findViewById(R.id.SeekBarVal);

//initial value
coSeekBar.setProgress(ciInitVal-ciMinVal);
}

public void setSummary(int aiVal)
{
String lsSummary="";

lsSummary = (aiVal) + csUnit;

super.setSummary(lsSummary);
}

protected void onDialogClosed(boolean positiveResult)
{
if (positiveResult)
{
// 保存SeekBar的值
persistInt(coSeekBar.getProgress()+ciMinVal);

// must reset initval
ciInitVal = coSeekBar.getProgress()+ciMinVal;
}

super.onDialogClosed(positiveResult);
}

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
coSeekBarValView.setText((ciMinVal+progress)+csUnit);
this.setSummary((ciMinVal+progress)+csUnit);
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

}
}

3、SeekBar的布局xml:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:paddingTop="10px"
android:paddingLeft="10px"
android:paddingRight="10px"
android:paddingBottom="10px"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<SeekBar
android:id="@+id/SeekBarControl"
android:paddingLeft="10px"
android:paddingRight="10px"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView
android:id="@+id/SeekBarMin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:textSize="18px"
android:text="Min" />

<TextView
android:id="@+id/SeekBarVal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textSize="18px"
android:text="" />

<TextView
android:id="@+id/SeekBarMax"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textSize="18px"
android:text="Max" />

</RelativeLayout>

</LinearLayout>

更多相关文章

  1. android studio中xml文件报错: URI is not registered的解决办法
  2. Android(安卓)SDK manager无法启动原因
  3. Android实时监控网络状态
  4. android studio升级失败提示 Connection failed解决方法
  5. Android(安卓)FAQ
  6. android permiss manager (安全软件获取权限 禁用 可用 提示状态)
  7. Android(安卓)下拉搜索提示框的实现
  8. IntelliJ IDEA/Android(安卓)Studio svn commit提示失败却实际成
  9. centos安装php扩展mcrypt

随机推荐

  1. android 生成二维码
  2. android如何使用menu键
  3. Android(安卓)TextView限定行数最大值,点
  4. android的ndk修改app_platform的方法,亲测
  5. Android.API.Context.getFilesDir()
  6. Android库项目的导出及其引用资源
  7. android 屏幕方向控制
  8. Android(安卓)studio安装Genymotion插件
  9. Android(安卓)7.1使用以太网口共享本机4G
  10. android设置字符串到剪贴板