2011-06-18 20 views
10

He hecho que EditTextPreference 'textPasscode' dependa de un CheckBoxPreference 'checkBoxPasscode'. Quiero que el 'textPasscode' se abra tan pronto como el usuario marque la casilla de verificación ... ¿Es posible? Si es así, ¿qué puedo usar en la función onSharedPreferenceChanged()?Abrir EditTextPreference a través del código (programáticamente)

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
     if(key.contentEquals("checkBoxPasscode")){ 
       // ----some method to open edit text "textPasscode" ?? 
      } 
} 

Gracias

Respuesta

12

Este problema fue muy molesto para mí, así que después de implementar la sugerencia de Sandor, he buscado una mejor solución en la Referencia de Android, y mire lo que he encontrado.
EditTextPreference hereda de DialogPreference y esta clase tiene el método showDialog, así que he creado una nueva clase desde EditTextPreference con un método show, y funciona como un charme.

Aquí hay un código:

public class MyEditTextPref extends EditTextPreference { 
    //...constructor here.... 

    public void show() { 
     showDialog(null); 
    } 
} 

En mi settings.xml (wich que utilizo para generar el diseño ActivitySettings) he añadido myEditTextPref

<package.that.contains.MyEditTextPreferences 
    android:key="myPref" 
    android:title="@string/pref_title" 
    android:summary="@string/pref_summary" 
    android:dialogTitle="@string/dialog_title" 
    android:dialogMessage="@string/dialog_message" 
/> 

Y lo último que he hecho es el método onSharedPreferenceChanged en PreferenceAct ivity

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (key.equalsIgnoreCase(MY_CHECK_BOX)) { 
     MyEditTextPreferences myPref = (MyEditTextPreferences) findPreference("myPref"); 
     myPref.show(); 
    } 
} 

ps .: realidad no estoy usando PreferenceFragment porque quiero compatibilidad pre-nido de abeja, pero no creo que este cambio código mucho.

+1

la mejor respuesta de la historia :) muchas gracias :) – cV2

+0

Me aparece una pila 'BadTokenException: no se puede agregar window' a veces. ¿Alguna idea de por qué? – theblang

+0

Parece suceder cuando dejo 'PreferenceActivity 'y luego regreso. ¿Supongo que algo está apagado con el 'contexto' tal vez? – theblang

4

me encontré con el mismo problema. Me pregunto que no es un problema común, hay muy pocos resultados de búsqueda con respecto a esto en la red.

Parece que no es posible mostrar EditTextPreference manualmente desde el código, aunque hay una solución obvia.

Puede lograr el mismo aspecto y comportamiento creando un cuadro de diálogo de alerta y manejando el evento onclickevent del botón OK.

Esto es código general simple para un diálogo de entrada de texto:

public static EditText showInputDialog(Context context, OnClickListener clickListener, String message) 
{ 
    LayoutInflater factory = LayoutInflater.from(context); 
    final View textEntryView = factory.inflate(R.layout.dialogedittext, null);    
    final EditText editText = (EditText)textEntryView.findViewById(id.dialogEditText); 
    final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder  
    .setTitle(message) 
    .setView(textEntryView) 
    .setPositiveButton("OK", clickListener) 
    .setNegativeButton("Cancel", null).show(); 
    return editText; 
} 

sólo tiene que pasar en un OnClickListener y manejar los ajustes de preferencias allí. No olvides establecer una variable EditText para recibir la cadena de entrada que el usuario ingresó.

Espero que ayude a ahorrar tiempo a las personas que buscan este problema.

+0

Muchas gracias. Eso definitivamente ayuda a –

Cuestiones relacionadas