Custom built-in SeekBarPreference - how to set SeekBar progress to the 1st run?

I prepared a simple test project for my question on GitHub.

My project has a custom built-in SeekBarPreference that basically works fine (the summary is updated when the arrow is dragged and it saves an integer value):

app screenshot

However, there is a problem:

When you first start the application (you may need to uninstall my application when you try to see the error again), the progress is SeekBarnot installed (but the bulletins are installed):

app screenshot

My question is: how to fix this problem in my code?

mSeekBar.setProgress(mProgress) SeekBarPreference.java, .

( , Stackoverflow - GitHub) -

MainActivity.java:

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

getFragmentManager().beginTransaction()
    .addToBackStack(null)
    .replace(R.id.root, new PrefFragment(), "prefs")
    .commit();

PrefFragment.java:

@Override
public void onResume() {
    super.onResume();

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
    // set the summaries from saved values
    onSharedPreferenceChanged(prefs, SEEK_1);
    onSharedPreferenceChanged(prefs, SEEK_2);
    prefs.registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

    if (SEEK_1.equals(key)) {
        int i1 = prefs.getInt(key, DEFAULT_1);
        mSeek1.setSummary("$ " + i1);
    } else if (SEEK_2.equals(key)) {
        int i2 = prefs.getInt(key, DEFAULT_2);
        mSeek2.setSummary("$ " + i2);
    }       
}  

SeekBarPreference.java ( ):

public class SeekBarPreference extends Preference implements OnSeekBarChangeListener {

    private SeekBar mSeekBar; // FIXME how to set its progress?
    private int mProgress;

    public SeekBarPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected View onCreateView(ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.preference_seekbar, parent, false);
        // can also be done in onBindView, does not work either
        mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
        mSeekBar.setProgress(mProgress);
        mSeekBar.setOnSeekBarChangeListener(this);
        return view;
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (!fromUser)
            return;

        setValue(progress);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // not used
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // not used
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        setValue(restoreValue ? getPersistedInt(mProgress) : (Integer) defaultValue);
    }

    public void setValue(int value) {
        if (shouldPersist()) {
            persistInt(value);
        }

        if (value != mProgress) {
            mProgress = value;
            notifyChanged();
        }
    }
}

UPDATE:

, sofar -

1) onCreateView():

    int progress = getPersistedInt(mProgress); // shows 0 in debugger
    mSeekBar.setProgress(progress);

2) setValue():

    if (value != mProgress) {
        mProgress = value;
        mSeekBar.setProgress(mProgress);
        notifyChanged();
    }

, , mSeekBar 0.

, SeekBarPreference Google - , ( ).

+4
4

onGetDefaultValue SeekBarPreference.

:

@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
    return a.getInt(index, 0);
}
+4

mSeek1 = (SeekBarPreference) findPreference(SEEK_1);

private int mProgress; 0

, , SeekBarPreference mProgress :

mSeek1 = (SeekBarPreference) findPreference(SEEK_1);
mSeek1.setMProgress(valueIhopeIsKnownAtThisMonent);
0

: ProgressBar!

... , ...

, :

seekBar.setMax(50);
seekBar.setProgress(20);
seekBar.setMax(20);
seekBar.setProgress(20);

setProgress (...), , drawable, . setMax. . , android ProgressBar! 8 . Lol: D

To solve this problem, I just do bar.setProgress (0) before each update ... this is just a workaround, but it works for me, as expected:

seekBar.setMax(50);
seekBar.setProgress(20);
seekBar.setProgress(0); // <--
seekBar.setMax(20);
seekBar.setProgress(20);
0
source

Add this code before calling mSeekBar.setProgress(mProgress);:

String preferenceSummary = this.getSummary().toString();
preferenceSummary = preferenceSummary.replace("$ ", "");
mProgress = Integer.valueOf(preferenceSummary);
0
source

All Articles