我创建了一个“自定义” 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
。
为此可以采取什么措施?
回调方法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
仅当用户更改时的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句