forked from extern/Unexpected-Keyboard
47f9043096
When changing any numeric setting and cancelling this change, the change would not be persisted, but the summary in the setting screen would show the last position of the slider instead of the correct unchanged value. This commit fixes this on the most simple way by resetting the slider position to the persisted value.
121 lines
2.8 KiB
Java
121 lines
2.8 KiB
Java
package juloo.common;
|
|
|
|
import android.content.Context;
|
|
import android.content.res.TypedArray;
|
|
import android.preference.DialogPreference;
|
|
import android.util.AttributeSet;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.TextView;
|
|
import android.widget.SeekBar;
|
|
|
|
/*
|
|
** IntSlideBarPreference
|
|
** -
|
|
** Open a dialog showing a seekbar
|
|
** -
|
|
** xml attrs:
|
|
** android:defaultValue Default value (int)
|
|
** min min value (int)
|
|
** max max value (int)
|
|
** -
|
|
** Summary field allow to show the current value using %s flag
|
|
*/
|
|
public class IntSlideBarPreference extends DialogPreference
|
|
implements SeekBar.OnSeekBarChangeListener
|
|
{
|
|
private LinearLayout _layout;
|
|
private TextView _textView;
|
|
private SeekBar _seekBar;
|
|
|
|
private int _min;
|
|
|
|
private String _initialSummary;
|
|
|
|
public IntSlideBarPreference(Context context, AttributeSet attrs)
|
|
{
|
|
super(context, attrs);
|
|
_initialSummary = getSummary().toString();
|
|
_textView = new TextView(context);
|
|
_textView.setPadding(48, 40, 48, 40);
|
|
_seekBar = new SeekBar(context);
|
|
_seekBar.setOnSeekBarChangeListener(this);
|
|
_min = attrs.getAttributeIntValue(null, "min", 0);
|
|
int max = attrs.getAttributeIntValue(null, "max", 0);
|
|
_seekBar.setMax(max - _min);
|
|
_layout = new LinearLayout(getContext());
|
|
_layout.setOrientation(LinearLayout.VERTICAL);
|
|
_layout.addView(_textView);
|
|
_layout.addView(_seekBar);
|
|
}
|
|
|
|
@Override
|
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
|
|
{
|
|
updateText();
|
|
}
|
|
|
|
@Override
|
|
public void onStartTrackingTouch(SeekBar seekBar)
|
|
{
|
|
}
|
|
|
|
@Override
|
|
public void onStopTrackingTouch(SeekBar seekBar)
|
|
{
|
|
}
|
|
|
|
@Override
|
|
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue)
|
|
{
|
|
int value;
|
|
|
|
if (restorePersistedValue)
|
|
{
|
|
value = getPersistedInt(_min);
|
|
}
|
|
else
|
|
{
|
|
value = (Integer)defaultValue;
|
|
persistInt(value);
|
|
}
|
|
_seekBar.setProgress(value - _min);
|
|
updateText();
|
|
}
|
|
|
|
@Override
|
|
protected Object onGetDefaultValue(TypedArray a, int index)
|
|
{
|
|
return (a.getInt(index, _min));
|
|
}
|
|
|
|
@Override
|
|
protected void onDialogClosed(boolean positiveResult)
|
|
{
|
|
if (positiveResult)
|
|
persistInt(_seekBar.getProgress() + _min);
|
|
else
|
|
_seekBar.setProgress(getPersistedInt(_min) - _min);
|
|
|
|
updateText();
|
|
}
|
|
|
|
protected View onCreateDialogView()
|
|
{
|
|
ViewGroup parent = (ViewGroup)_layout.getParent();
|
|
|
|
if (parent != null)
|
|
parent.removeView(_layout);
|
|
return (_layout);
|
|
}
|
|
|
|
private void updateText()
|
|
{
|
|
String f = String.format(_initialSummary, _seekBar.getProgress() + _min);
|
|
|
|
_textView.setText(f);
|
|
setSummary(f);
|
|
}
|
|
}
|