seekbar - Android SeekBarPreference -
i'm trying implement seekbarpreference class using http://android-journey.blogspot.com/2010/01/for-almost-any-application-we-need-to.html tutorial relativelayout. first problem textview preferencetext isn't showing @ all. second problem bar can't slided in regular preferences (like media volume bar)?
public class seekbarpreference extends preference implements onseekbarchangelistener { public static int maximum = 100; public static int interval = 5; private float oldvalue = 25; private textview indicator; public seekbarpreference(context context) { super(context); } public seekbarpreference(context context, attributeset attrs) { super(context, attrs); } public seekbarpreference(context context, attributeset attrs, int defstyle) { super(context, attrs, defstyle); } @override protected view oncreateview(viewgroup parent) { float scale = getcontext().getresources().getdisplaymetrics().density; relativelayout layout = new relativelayout(getcontext()); relativelayout.layoutparams textparams = new relativelayout.layoutparams( relativelayout.layoutparams.wrap_content, relativelayout.layoutparams.wrap_content); relativelayout.layoutparams sbarparams = new relativelayout.layoutparams( math.round(scale * 160), relativelayout.layoutparams.wrap_content); relativelayout.layoutparams indparams = new relativelayout.layoutparams( relativelayout.layoutparams.wrap_content, relativelayout.layoutparams.wrap_content); textview preferencetext = new textview(getcontext()); preferencetext.setid(0); preferencetext.settext(gettitle()); preferencetext.settextsize(18); preferencetext.settypeface(typeface.sans_serif, typeface.bold); seekbar sbar = new seekbar(getcontext()); sbar.setid(1); sbar.setmax(maximum); sbar.setprogress((int)this.oldvalue); sbar.setonseekbarchangelistener(this); this.indicator = new textview(getcontext()); this.indicator.settextsize(12); this.indicator.settypeface(typeface.monospace, typeface.italic); this.indicator.settext("" + sbar.getprogress()); textparams.addrule(relativelayout.align_parent_left); sbarparams.addrule(relativelayout.right_of, preferencetext.getid()); indparams.setmargins(math.round(20*scale), 0, 0, 0); indparams.addrule(relativelayout.right_of, sbar.getid()); preferencetext.setlayoutparams(textparams); sbar.setlayoutparams(sbarparams); this.indicator.setlayoutparams(indparams); layout.addview(preferencetext); layout.addview(this.indicator); layout.addview(sbar); layout.setid(android.r.id.widget_frame); return layout; } @override public void onprogresschanged(seekbar seekbar, int progress, boolean fromuser) { progress = math.round(((float) progress)/interval) * interval; if(!callchangelistener(progress)) { seekbar.setprogress((int) this.oldvalue); return; } seekbar.setprogress(progress); this.oldvalue = progress; this.indicator.settext("" + progress); updatepreference(progress); notifychanged(); } @override public void onstarttrackingtouch(seekbar seekbar) { } @override public void onstoptrackingtouch(seekbar seekbar) { } @override protected object ongetdefaultvalue(typedarray ta, int index) { int dvalue = ta.getint(index, 25); return validatevalue(dvalue); } @override protected void onsetinitialvalue(boolean restorevalue, object defaultvalue) { int temp = restorevalue ? getpersistedint(25) : (integer)defaultvalue; if(!restorevalue) persistint(temp); this.oldvalue = temp; } private int validatevalue(int value) { if(value > maximum) value = maximum; else if (value < 0) value = 0; else if (value % interval != 0) value = math.round(((float) value)/interval) * interval; return value; } private void updatepreference(int newvalue) { sharedpreferences.editor editor = geteditor(); editor.putint(getkey(), newvalue); editor.commit(); }
}
the problem sliding here due notifychange()
call. interfering sliding somehow. working on similar widget because not dialog approach.
as promised here solution added open source project:
i have written seekbarpreference class embeded widget inside preferences activity instead of popup dialog. can download jar file from:
the class documentation , usage here: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/seekbarpreference.html
also not forget checkout handy companion class auto show summary when change seekbar: http://aniqroid.sileria.com/doc/api/com/sileria/android/event/prefsseekbarlistener.html
Comments
Post a Comment