2012-03-16 11 views
6

Tengo una actividad de preferencia con, entre otras cosas, una categoría que incluye opciones de reenvío de llamadas. Lo que quiero es una preferencia que:¿Es posible combinar una EditTextPreference con una CheckBoxPreference?

  • Habilita/deshabilita si el usuario presiona una casilla a la derecha.
  • abre el cuadro de diálogo EditTextPreference si el usuario presiona el texto (o cualquier otra cosa en la preferencia)

Probablemente no sea de alguna utilidad, pero aquí es un fragmento de esta preferencecategory en particular:

<PreferenceCategory 
     android:title="@string/category_callforward"> 

    <EditTextPreference 
      android:key="call_forward_always" 
      android:title="@string/call_forward_always" 
      android:summary="@string/call_forward_forwardto" /> 
    </PreferenceCategory> 

EDITAR

me gustaría ponerlo en práctica en este método, si es posible:

// Locates the correct data from saved preferences and sets input type to numerics only 
private void setCallForwardType() 
{ 
    ep1 = (EditTextPreference) findPreference("call_forward_always"); 

    EditText et = (EditText) ep1.getEditText(); 
    et.setKeyListener(DigitsKeyListener.getInstance()); 

} 

Edit2

Si alguien está todavía se pregunta - esto es lo que yo quiero como una preferencia:

http://i.imgur.com/GHOeK.png

Edit3

tengo marchito ched alrededor por un par de horas y han llegado con una sola palabra: 'PreferenceGroupAdapter'. Sin embargo, no he podido encontrar ejemplos o tutoriales que me muestren cómo usarlo. Sugerencias? ¿Es este el camino correcto a seguir?

EDIT4

Si esto realmente no es, posiblemente, me gustaría mucho que una sugerencia de una alternativa de solución (fácil de usar) que puedo aplicar en lugar de la preferencia y Editar- Casilla combinado.

+0

¿Alguna vez se las arreglan para resolver este problema? He estado tratando de crear una preferencia personalizada como esta, ya sea con la casilla de verificación en la fila de preferencia o incorporada en el cuadro de diálogo de preferencias, pero esta es la única referencia que he logrado encontrar en cualquier lugar. –

+0

@ SeanO'Toole Vea si mi respuesta ayuda. – theblang

Respuesta

2

Puede hacerlo. Primero, cree una clase para preferencias que se debe extender desde PreferenceActivity. Use esto:

// editbox ise your EditTextPreference, so set it. 
checkbox = (CheckBoxPreference) findPreference("checkbox_preference"); 

checkbox.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
    public boolean onPreferenceChange(Preference preference, Object newValue) { 
     if(newValue.toString().equals("false")) { 
      PrefActivity.this.editbox.setEnabled(false); 
     } else if(newValue.toString().equals("true")) { 
      PrefActivity.this.editbox.setEnabled(true); 
     } 
     return true; 
    } 
}); 

Espero que ayude.

+0

Ya tengo mi SettingsActivity que, obviamente, extiende PreferenceActivity. ¿No puedo simplemente crear un método dentro de esta clase que siga a tu sugerencia? También. estás usando findPreference(). ¿Deberían estas preferencias de chechbox agregarse programáticamente en onCreate()? – CodePrimate

+0

Sí, crea un método llamado 'listeners' y llama al método' onCreate'. Funcionará. –

+0

He editado mi comentario :) – CodePrimate

1

Defina una clave en res/values/strings.xml para su CheckBoxPreference.

Dé su CheckBoxPreference el atributo XML android:key="@string/THE_KEY_YOU_DEFINED" para que guarde automáticamente el estado en SharedPreferences.

Dé su EditTextPreference el atributo XML android:dependency="@string/THE_KEY_YOU_DEFINED.

El EditTextPreference debe habilitar/deshabilitar dependiendo del estado de CheckBoxPreference.

0

Un poco tarde pero creo que he logrado crear algo similar creación de esta clase que crea un diseño con una edición de texto y una casilla de verificación:

public class CheckEditTextPreference extends DialogPreference { 
    protected static final String chkKey="ChkKey"; 
    private EditText editText; 
    private CheckBox checkBox; 
    private String etValue; 
    private boolean chkValue; 
    SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 

    public CheckEditTextPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 

    } 

    public CheckEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected View onCreateDialogView() { 
     FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     layoutParams.setMargins(25, 0, 0, 0); 
     LinearLayout llChkEtPreference=new LinearLayout(getContext()); 
     llChkEtPreference.setOrientation(LinearLayout.VERTICAL); 
     llChkEtPreference.setLayoutParams(layoutParams); 
     checkBox=new CheckBox(getContext()); 
     editText = new EditText(getContext()); 
     editText.setLayoutParams(layoutParams); 
     checkBox.setLayoutParams(layoutParams); 
     checkBox.setText("Disabled"); 
     FrameLayout dialogView = new FrameLayout(getContext()); 
     llChkEtPreference.addView(editText); 
     llChkEtPreference.addView(checkBox); 
     dialogView.addView(llChkEtPreference); 
     checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       editText.setEnabled(!isChecked); 
      } 
     }); 
     return dialogView; 
    } 

    @Override 
    protected void onBindDialogView(View view) { 
     super.onBindDialogView(view); 
     checkBox.setChecked(getValueChk()); 
     editText.setText(getValueEt()); 
    } 

    @Override 
    protected void onDialogClosed(boolean positiveResult) { 
     if (positiveResult) { 
      String newValue = editText.getText().toString(); 
      boolean newValueChk=checkBox.isChecked(); 
      if (callChangeListener(newValue)) { 
       setValueEt(newValue); 
      } 
      if(callChangeListener(newValueChk)) 
      { 
       setValueChk(newValueChk); 
      } 
     } 
    } 

    @Override 
    protected Object onGetDefaultValue(TypedArray a, int index) { 
     return a.getString(index); 
    } 

    @Override 
    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { 
     setValueEt(restorePersistedValue ? getPersistedString("") : defaultValue.toString()); 
     setValueChk(mySharedPreferences.getBoolean(chkKey, true)); 
    } 

    public void setValueEt(String value) { 
     this.etValue = value; 
     persistString(this.etValue); 
    } 

    public String getValueEt() { 
     return this.etValue; 
    } 
    public void setValueChk(boolean value) { 
     this.chkValue = value; 
     mySharedPreferences.edit().putBoolean(chkKey, this.chkValue).apply(); 
    } 

    public boolean getValueChk() { 
     return this.chkValue; 
    } 
} 

Y poner esto en sus preferencias (recuerda que " . android.example.example.com.androiddemo" es el nombre del paquete):

<android.example.example.com.androiddemo.CheckEditTextPreference 
     android:key="chkEtPref" 
     android:title="Title"/> 

Para obtener los datos que puede intentar algo así como este ejemplo en su actividad principal:

if(!mySharedPreferences.getBoolean(CheckEditTextPreference.chkKey, true)) 
    Toast.makeText(this, mySharedPreferences.getString("chkEtPref", "Testing"),Toast.LENGTH_LONG).show(); 

Disabled Enabled

Cuestiones relacionadas