SeekBar的onProgressChanged()被调用两次

yad*_*_vi 5 android seekbar preference

我创建了一个Custom SeekBarPreference,它显示了一个从中选择的时间范围(例如0.2秒到2.2秒).我的问题是onProgressChanged()被调用两次 - 一次用progress = 0,第二次用progress = "actual value".我将值存储在a中,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 */
}
Run Code Online (Sandbox Code Playgroud)

在这里,我已经检查了进度的值,not equal to 0因此它避免了第一次调用.然而,这种副作用是我无法设置任何东西0.

有什么可以解决这个问题?

yad*_*_vi 8

回调方法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));
}
Run Code Online (Sandbox Code Playgroud)

TextView仅在用户更改值时设置其值.