SliderPreference.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * Copyright 2012 Jay Weisskopf
  3. *
  4. * Licensed under the MIT License (see LICENSE.txt)
  5. */
  6. package net.jayschwa.android.preference;
  7. import android.content.Context;
  8. import android.content.res.TypedArray;
  9. import android.preference.DialogPreference;
  10. import android.util.AttributeSet;
  11. import android.util.Log;
  12. import android.view.View;
  13. import android.widget.SeekBar;
  14. import android.widget.TextView;
  15. import java.math.BigDecimal;
  16. /**
  17. * @author Jay Weisskopf
  18. */
  19. public class SliderPreference extends DialogPreference {
  20. private static final String TAG = "SliderPreference";
  21. protected float mValue, mValueOriginal, mMin, mMax, mResolution, mScale;
  22. protected String mFormat;
  23. public SliderPreference(Context context, AttributeSet attrs) {
  24. super(context, attrs);
  25. setup(context, attrs);
  26. }
  27. public SliderPreference(Context context, AttributeSet attrs, int defStyle) {
  28. super(context, attrs, defStyle);
  29. setup(context, attrs);
  30. }
  31. private void setup(Context context, AttributeSet attrs) {
  32. setPersistent(true);
  33. // shouldPersist();
  34. //if( getPersistedFloat( -42f ) == -42f ) {
  35. // persistFloat( 0f );
  36. //}
  37. setDialogLayoutResource(R.layout.slider_preference_dialog);
  38. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SliderPreference);
  39. try {
  40. mValueOriginal = mValue = 0;
  41. mMin = 0;
  42. mMax = 100;
  43. mResolution = 0.1f;
  44. mScale = 1;
  45. mFormat = "%.2f";
  46. //setSummary(a.getTextArray(R.styleable.SliderPreference_android_summary));
  47. // a.get
  48. mFormat = a.getString(R.styleable.SliderPreference_format);
  49. mMin = a.getFloat(R.styleable.SliderPreference_minn, 0);
  50. mMax = a.getFloat(R.styleable.SliderPreference_android_max, 100);
  51. mResolution = a.getFloat(R.styleable.SliderPreference_resolution, 1);
  52. mScale = a.getFloat(R.styleable.SliderPreference_scales, 1);
  53. } catch (Exception e) {
  54. Log.e("SliderPreference", "Error in attributes");
  55. }
  56. a.recycle();
  57. }
  58. // TODO implement :
  59. // valueStorageToDialog
  60. // valueDialogToStorage
  61. // valueFormat ( currency symbol, precision etc )
  62. protected String valueFormat( float value ) {
  63. if( mFormat != null )
  64. return String.format(mFormat, value);
  65. else
  66. return "" + value;
  67. }
  68. @Override
  69. protected Object onGetDefaultValue(TypedArray a, int index) {
  70. return a.getFloat(index, 0);
  71. }
  72. @Override
  73. protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
  74. try {
  75. mValueOriginal = mValue = restoreValue ? getPersistedFloat( 0 ) / mScale : (float) defaultValue / mScale;
  76. persistFloat( mValue * mScale );
  77. }
  78. catch( Exception e ) {
  79. Log.e( TAG, "Types do not match:" + this.getKey() );
  80. }
  81. }
  82. @Override
  83. public CharSequence getSummary() {
  84. try {
  85. return String.format( super.getSummary().toString(), valueFormat( mValue /* mScale */ ) );
  86. }
  87. catch( Exception e ) {
  88. Log.e( TAG, "getSummary error, format: '" + this.getKey() + "'" );
  89. }
  90. return "";
  91. }
  92. protected float getValueFromSeekbar( int progress ) {
  93. return mMin + progress * mResolution;
  94. }
  95. @Override
  96. protected View onCreateDialogView() {
  97. // mSeekBarValue = (int) (mValue * SEEKBAR_RESOLUTION);
  98. final View view = super.onCreateDialogView();
  99. SeekBar seekbar = (SeekBar) view.findViewById(R.id.slider_preference_seekbar);
  100. seekbar.setMax( (int) ( ( mMax - mMin ) / mResolution ) );
  101. mValue = Math.min( mValue, mMax);
  102. mValue = Math.max( mValue, mMin );
  103. seekbar.setProgress( (int) ( ( mValue - mMin ) / mResolution ) );
  104. TextView min, max;
  105. min = (TextView) view.findViewById( R.id.min );
  106. max = (TextView) view.findViewById( R.id.max );
  107. min.setText( valueFormat( mMin ) );
  108. max.setText( valueFormat( mMax ) );
  109. TextView value = (TextView) view.findViewById( R.id.value );
  110. value.setText( valueFormat( mValue ) );
  111. seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  112. @Override
  113. public void onStopTrackingTouch(SeekBar seekBar) {
  114. }
  115. @Override
  116. public void onStartTrackingTouch(SeekBar seekBar) {
  117. }
  118. @Override
  119. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  120. if (fromUser) {
  121. mValue = getValueFromSeekbar( progress );
  122. TextView value = (TextView) view.findViewById( R.id.value );
  123. value.setText( valueFormat( mValue ) );
  124. }
  125. }
  126. });
  127. return view;
  128. }
  129. @Override
  130. protected void onDialogClosed(boolean positiveResult) {
  131. if ( positiveResult && callChangeListener( mValue * mScale ) ) {
  132. if( shouldPersist() ) {
  133. try {
  134. persistFloat( mValue * mScale );
  135. }
  136. catch( ClassCastException e ) {
  137. getEditor().remove(getKey());
  138. getEditor().putFloat(getKey(), mValue * mScale);
  139. getEditor().commit();
  140. //persistFloat(mValue * mScale);
  141. }
  142. }
  143. if ( mValueOriginal != mValue ) {
  144. notifyChanged();
  145. mValueOriginal = mValue;
  146. }
  147. }
  148. super.onDialogClosed(positiveResult);
  149. }
  150. }