我创建了一个自定义SeekBarPreference
,以便显示一个可供选择的时间范围(比如0.2
秒到2.2
秒)。我的问题是onProgressChanged()被调用两次 - 一次是progress = 0
,第二次是progress = "actual value"
。我将值存储在SharedPreference
中,以便稍后在我的应用程序中使用它。
这是我的代码片段 -
@Override
protected View onCreateDialogView() {
LayoutInflater inflator = ((PreferenceActivity) mContext)
.getLayoutInflater();
View view = inflator.inflate(R.layout.seek_bar, null);
mCurrentValue = PreferenceManager.getDefaultSharedPreferences(mContext)
.getFloat(this.getKey(), mDefaultValue);
......
SeekBar mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
mSeekBar.setOnSeekBarChangeListener(this);
mSeekBar.setMax(20);
mSeekBar.setProgress((int) ((mCurrentValue - mMinValue)
/ (mMaxValue - mMinValue) * 20)); // 20 = progress bar max value.
return view;
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (progress != 0) {
mCurrentValue = (float) ((float) progress / 20
* (mMaxValue - mMinValue) + mMinValue);
}
mValueText.setText(Float.toString(mCurrentValue));
/* mValueText is a TextBox where I display my Current Value */
}
在这里,我检查了进度的值,使其为not equal to 0
,因此它避免了第一次调用。但是,这样做的副作用是我无法将任何内容设置为0
。
有什么可以解决这个问题?
答案 0 :(得分:7)
回调方法onProgressChanged()
有一个boolean
参数fromUser
使用此参数,我们可以确定更改是来自框架还是由用户自己制作。
因此,像 -
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) { // If the changes are from the User only then accept the
// changes
/* Instead of -> if (progress != 0) { */
mCurrentValue = (float) ((float) progress / 20
* (mMaxValue - mMinValue) + mMinValue);
mCurrentValue *= 10;
mCurrentValue = Math.round(mCurrentValue);
mCurrentValue /= 10;
}
mValueText.setText(Float.toString(mCurrentValue));
}
仅在用户更改TextView
时设置{{1}}的值。
答案 1 :(得分:2)
您可以使用OnSeekBarChangeListener的后续方法。
public void onStopTrackingTouch(SeekBar seekBar) {
int progress=seekBar.getProgress();
}
答案 2 :(得分:1)
我今天遇到了另一个问题(自定义SeekBar和PreferenceFragment)。我不知道为什么,但下面的代码只能工作两次:开始触摸和停止时:
mTextViewValue = (TextView) view.findViewById(R.id.seekbar_value);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(@NonNull SeekBar seekBar, int progress, boolean fromUser) {
mTextViewValue.setText(String.valueOf(newValue));
}
最后我得到了解决方案。这个有效:
final TextView valueTextView = (TextView) view.findViewById(R.id.seekbar_value);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(@NonNull SeekBar seekBar, int progress, boolean fromUser) {
valueTextView.setText(String.valueOf(newValue));
}
也许对某人有所帮助。