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(); } 

}

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:

http://aniqroid.sileria.com/

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.

  • Custom DatePicker as Preference no guarda valor cuando el usuario edita el valor en el campo
  • Android obtiene la vista de Preferencia en PreferenciaActividad
  • Título de preferencia de Android / estilo de texto de resumen
  • Android preferencia reactivación de relleno en orientación horizontal
  • Título de Preferencia de Android en dos líneas
  • Android cómo obtener la preferencia Pantalla de un checkBoxPreference
  • SwitchPreference no cambia el estado después de establecer onPreferenceChangeListener
  • Crear una DialogPreference desde XML
  • ¿Cómo puedo configurar el color de texto de resumen de preferencias de Android?
  • Preferencias de diferentes alturas dentro de una PreferenciaActividad
  • OnBindDialogView no llamado - ¿Por qué?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.