android - Custom inline SeekBarPreference - how to set SeekBar progress on the 1st run? -
i have prepared a simple test project question @ github.
in project there custom inline seekbarpreference, works fine (its summary updated when seekbar being dragged , saves integer value):

however there problem:
on 1st run of app (you might need uninstall app when try see error again) progress of seekbar not set (but summaries set):

my question is: how fix issue in code?
i have tried adding mseekbar.setprogress(mprogress) in different spots of seekbarpreference.java, can't find correct place code.
below excerpts source code (in case stackoverflow ever outlives github) -
preferencemanager.setdefaultvalues(this, r.xml.preferences, false); getfragmentmanager().begintransaction() .addtobackstack(null) .replace(r.id.root, new preffragment(), "prefs") .commit(); @override public void onresume() { super.onresume(); sharedpreferences prefs = getpreferencemanager().getsharedpreferences(); // set summaries 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 (the complete source code):
public class seekbarpreference extends preference implements onseekbarchangelistener { private seekbar mseekbar; // fixme how set 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 done in onbindview, 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:
what have unsuccessfully tried sofar -
1) adding following lines oncreateview() method:
int progress = getpersistedint(mprogress); // shows 0 in debugger mseekbar.setprogress(progress); 2) adding following lines setvalue() method:
if (value != mprogress) { mprogress = value; mseekbar.setprogress(mprogress); notifychanged(); } alas not work, progress of mseekbar stays @ 0.
also, there seekbarpreference google - don't understand how works there (or if works @ all).
you need override ongetdefaultvalue in seekbarpreference.
try this:
@override protected object ongetdefaultvalue(typedarray a, int index) { return a.getint(index, 0); }
Comments
Post a Comment