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):

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):

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();
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;
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);
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) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@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 - , ( ).