Android SeekBarPreference

Android SeekBarPreference,android,seekbar,preference,Android,Seekbar,Preference,我目前正在尝试使用带有RelativeLayout的教程来实现SeekBarPreference类。第一个问题是文本视图首选项文本根本不显示。 第二个问题是,该条不能像常规首选项(如媒体音量条)那样滑动 public类SeekBarPreference扩展了首选项实现 onseekbarchaneglistener{ 公共静态int最大值=100; 公共静态int间隔=5; 私有浮点值=25; 私有文本视图指示器; 公共SeekBarPreference(上下文){ 超级(上下文); } 公共S

我目前正在尝试使用带有RelativeLayout的教程来实现SeekBarPreference类。第一个问题是文本视图首选项文本根本不显示。 第二个问题是,该条不能像常规首选项(如媒体音量条)那样滑动

public类SeekBarPreference扩展了首选项实现
onseekbarchaneglistener{
公共静态int最大值=100;
公共静态int间隔=5;
私有浮点值=25;
私有文本视图指示器;
公共SeekBarPreference(上下文){
超级(上下文);
}
公共SeekBarPreference(上下文、属性集属性){
超级(上下文,attrs);
}
公共SeekBarPreference(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
@凌驾
受保护的视图onCreateView(视图组父级){
浮动比例=getContext().getResources().getDisplayMetrics().density;
RelativeLayout布局=新的RelativeLayout(getContext());
RelativeLayout.LayoutParams textParams=新的RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_内容,
RelativeLayout.LayoutParams.WRAP_内容);
RelativeLayout.LayoutParams sbarParams=新的RelativeLayout.LayoutParams(
数学四舍五入(比例尺*160),
RelativeLayout.LayoutParams.WRAP_内容);
RelativeLayout.LayoutParams indParams=新的RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_内容,
RelativeLayout.LayoutParams.WRAP_内容);
TextView preferenceText=新的TextView(getContext());
preferenceText.setId(0);
preferenceText.setText(getTitle());
preferenceText.setTextSize(18);
preferenceText.setTypeface(Typeface.SANS_SERIF,Typeface.BOLD);
SeekBar sbar=新SeekBar(getContext());
sbar.setId(1);
sbar.setMax(最大值);
sbar.setProgress((int)this.oldValue);
sbar.setonseekbarchaneglistener(此);
this.Indicator=newtextView(getContext());
此.Indicator.setTextSize(12);
this.Indicator.setTypeface(Typeface.MONOSPACE,Typeface.ITALIC);
this.Indicator.setText(“+sbar.getProgress());
textParams.addRule(RelativeLayout.ALIGN\u PARENT\u LEFT);
sbarParams.addRule(RelativeLayout.RIGHT_OF,preferenceText.getId());
indParams.setMargins(数学四舍五入(20*刻度),0,0,0);
indParams.addRule(RelativeLayout.RIGHT_OF,sbar.getId());
preferenceText.setLayoutParams(textParams);
sbar.setLayoutParams(sbarParams);
this.Indicator.setLayoutParams(indParams);
layout.addView(首选项文本);
layout.addView(该指示器);
布局。添加视图(sbar);
layout.setId(android.R.id.widget_frame);
返回布局;
}
@凌驾
更改了公共进程无效(SeekBar SeekBar,int progress,
布尔值(用户){
进度=数学轮(((浮动)进度)/间隔)*间隔;
如果(!callChangeListener(进度)){
seekBar.setProgress((int)this.oldValue);
返回;
}
seekBar.setProgress(进度);
this.oldValue=进度;
此.Indicator.setText(“+progress”);
更新参考(进度);
notifyChanged();
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
@凌驾
受保护对象onGetDefaultValue(类型Darray ta,int索引){
intdvalue=ta.getInt(索引,25);
返回validateValue(dValue);
}
@凌驾
SetInitialValue上的受保护无效(布尔恢复值,
对象(默认值){
int temp=restoreValue?getPersistedInt(25):(整数)默认值;
如果(!restoreValue)
persistin(temp);
this.oldValue=温度;
}
私有int validateValue(int值){
如果(值>最大值)
值=最大值;
else if(值<0)
数值=0;
else if(值%interval!=0)
值=数学四舍五入(((浮点)值)/间隔)*间隔;
返回值;
}
私有void updatePreference(int newValue){
SharedReferences.Editor=getEditor();
putInt(getKey(),newValue);
commit();
}

}此处滑动的问题是由于调用了
notifyChange()。这在某种程度上干扰了滑动。我也在使用类似的小部件,因为我不喜欢对话框方法

正如我在这里承诺的,这是我添加到开源项目中的解决方案:

我编写了一个SeekBarPreference类,它嵌入到preferences活动中的小部件中,而不是弹出对话框。您可以从以下位置下载jar文件:

课程文档和用法如下所示:


另外,不要忘记签出handy companion类,以便在更改SeekBar时自动显示摘要:

滑块在教程中通过将onProgressChanged更改为

public void onProgressChanged( SeekBar seekBar, int progress, boolean fromUser )
{
    progress = Math.round( ( (float) progress ) / interval ) * interval;
    persistInt(progress);
    callChangeListener( progress );
    seekBar.setProgress( progress );
    this.monitorBox.setText( progress + "" );
    updatePreference( progress );
}

关于无法移动滑块,这是因为其宽度设置为80(参见参数2),太窄,不允许滑动。在为它设置了一个合理的宽度(例如400)以及相关的文本视图和一些mod,以使它能够用我的SDK版本编译之后,它对我起到了作用。与其他许多版本相比,此版本的一个优点是布局是在代码中完成的,而不是XML,这使得应用程序可以轻松实例化多个滑块。

谢谢!看起来很好,javadocs给人留下了深刻的印象。但举个例子也不会有什么坏处,特别是关于使用PrefsSeekBarListener进行实时显示。
public void onProgressChanged( SeekBar seekBar, int progress, boolean fromUser )
{
    progress = Math.round( ( (float) progress ) / interval ) * interval;
    persistInt(progress);
    callChangeListener( progress );
    seekBar.setProgress( progress );
    this.monitorBox.setText( progress + "" );
    updatePreference( progress );
}