Android SeekBarPreference
Actualmente estoy intentando implementar la clase SeekBarPreference usando http://android-journey.blogspot.com/2010/01/for-almost-any-application-we-need-to.html tutorial con RelativeLayout. El primer problema es TextView preferenciaText no se muestra en absoluto. Segundo problema es la barra no se puede deslizar como los de las preferencias regulares (como la barra de volumen de medios)?
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(); }
}
- Cambiar categoría de PreferenciaCategoría: título
- Cómo insertar DrawerLayout en PreferenceActivity en una aplicación de Android?
- Android: ¿Cómo maximizar el ancho de PreferenceFragment (o deshacerse del margen)?
- PreferenceActivity funciona correctamente en Android 2.1, pero no en 4.1 (acolchado)
- Preferencia android divisor horizontal en la preferencia personalizada?
- ¿Cómo volver de Preferencias subscreen a la pantalla principal en PreferenceFragmentCompat?
- Cómo implementar una confirmación (sí / no) DialogPreference?
- Personalización de CheckBoxPreference vía android: widgetLayout
- ¿Cómo actualiza PreferenceActivity para mostrar los cambios en la configuración?
- PreferenceFragment crashing, objeto nulo Referencia
- Intento de selección de archivos abierto desde preferencias
- PreferenciaCategoría en CardView
- Personalización del diseño de una pantalla PreferenceScreen
El problema con el deslizamiento aquí es debido a la llamada notifyChange()
. Eso está interfiriendo con el deslizamiento de alguna manera. También estoy trabajando en un widget similar porque no me gusta el método de diálogo.
Como se prometió aquí es la solución que he añadido a mi proyecto de código abierto:
He escrito una clase SeekBarPreference que se incrusta widget dentro de la actividad de preferencias en lugar de diálogo emergente. Puede descargar el archivo jar desde:
La documentación y uso de la clase está aquí: http://aniqroid.sileria.com/doc/api/com/sileria/android/view/SeekBarPreference.html
También no se olvide de retirar la clase de compañero práctico para mostrar automáticamente un resumen cuando cambia el SeekBar: http://aniqroid.sileria.com/doc/api/com/sileria/android/event/PrefsSeekBarListener.html
Slider funciona en el tutorial cambiando onProgressChanged a
public void onProgressChanged( SeekBar seekBar, int progress, boolean fromUser ) { progress = Math.round( ( (float) progress ) / interval ) * interval; persistInt(progress); callChangeListener( progress ); seekBar.setProgress( progress ); this.monitorBox.setText( progress + "" ); updatePreference( progress ); }
En cuanto a la imposibilidad de mover el control deslizante, esto se debe a que su ancho está ajustado a 80 (ver params2) que es demasiado estrecho para permitir el deslizamiento. Después de establecer una anchura razonable para ello, por ejemplo 400, y la vista de texto asociada y algunos mods para conseguir que compile con mi versión de SDK funcionó para mí. Una ventaja que esta versión tiene sobre muchos otros es que la disposición se hace en el código en vez del XML que permite que una aplicación instancia fácilmente varios resbaladores.
- Creación de un iterador recursivo
- ¿Cuáles son los riesgos de exponer la clave no tan secreta? ¿Hay alguna solución?