2012-06-13 22 views
28

He estado trabajando en mi cerebro toda la noche, pero parece que no puedo lograr esta pequeña cosa. Me gustaría agregar SwitchPreference a mi actividad de preferencia de una aplicación. Debajo hay una imagen.SwitchPreference onChecked/onClick Listener

Antes de decir demasiado, mi problema es exactamente esto: parece que no puedo poner a un oyente solo en la parte de Cambio de la preferencia. Puedo establecer un onPreferenceTreeClick y un onPreferenceClick en la preferencia, y eso funciona bien si presiono sobre la parte del texto. Pero cuando el Switch en sí no hace nada cuando lo cambio de OFF a ON.

He leído la documentación en SwitchPreference. También miré el android/packages/Settings y parece que AOSP usa un Switch y no un SwitchPreference para Wi-Fi y Bluetooth.

Aquí está mi intento (de trabajo si se pulsa sobre la totalidad del elemento de preferencias, pero no si sólo tiene que pulsar el interruptor):

muestra:

public class Preferences extends SherlockPreferenceActivity { 

public static final String PREF_THEME = "pref_theme_interface"; 
public static final String PREF_ROOT = "pref_root"; 
public static final String PREF_APP = "pref_app"; 

public static SharedPreferences mTheme; 
private static SharedPreferences mUpdate; 
public static SharedPreferences.Editor mEditor; 

public boolean SDK_COMPAT = true; 

boolean pSwitch = false; 
boolean update = true; 

Preference autoUpdate; 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      this.finish(); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    setTheme(MainActivity.THEME); 
    super.onCreate(savedInstanceState); 
    final ActionBar actionBar = getSupportActionBar(); 
    actionBar.setHomeButtonEnabled(true); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setIcon(R.drawable.ic_preferences); 

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     SDK_COMPAT = false; 
    } 

    mUpdate = PreferenceManager.getDefaultSharedPreferences(this); 
    update = mUpdate.getBoolean("update", false); 

    // Load the preferences from an XML resource 
    addPreferencesFromResource(R.xml.preferences); 

    setPreferenceScreen(createPreferenceSDK()); 

} 

private PreferenceScreen createPreferenceSDK() { 
    // Root 
    PreferenceScreen root = (PreferenceScreen)findPreference(PREF_ROOT); 

    PreferenceCategory prefApp = (PreferenceCategory)findPreference(PREF_APP); 

    //root.addPreference(prefApp); 

    if (SDK_COMPAT == true) { 
     pSwitch = true; 
     autoUpdate = new SwitchPreference(this); 
     autoUpdate.setKey("auto_update_pref"); 
     autoUpdate.setTitle(R.string.auto_update); 
     //autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); 
     prefApp.addPreference(autoUpdate); 
    } else { 
     pSwitch = false; 
     autoUpdate = new CheckBoxPreference(this); 
     autoUpdate.setKey("auto_update_pref"); 
     autoUpdate.setTitle(R.string.auto_update); 
     autoUpdate.setSummary(R.string.auto_update_summary); 
     prefApp.addPreference(autoUpdate); 
    } 

    autoUpdate.setOnPreferenceClickListener(new OnPreferenceClickListener() { 

     public boolean onPreferenceClick(Preference preference) { 
      mEditor = mUpdate.edit(); 
      boolean checked = ((SwitchPreference) preference) 
        .isChecked(); 
      if (checked) { 
       update = true; 
       mEditor.putBoolean("update", true); 
       mEditor.commit(); 
       autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); 
      } else { 
       update = false; 
       mEditor.putBoolean("update", false); 
       mEditor.commit(); 
       autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); 
      } 
      return true; 
     } 

    }); 

    return root; 
} 

Así reiterar mi pregunta en caso de que Ha perdido. ¿Cómo se establece un oyente en la porción Switch de SwitchPreference? Por favor, sé amable si es algo tan obvio. Anoche fue bastante tarde cuando traté de agregar esto.

Muchas gracias de antemano.

Notas: 1. No me opongo a seguir con CheckBoxPreference, pero prefiero usar Switch porque se ve bien.

  1. Sí, sé que hay un más fácil/mejor? forma de agregar preferencias dinámicas usando res/xml y res/xml-v14 en lugar de hacer la comprobación de SDK. Solo lo hice para probar.

picture of preference screen

EDITAR

Esperamos que esto ayude a alguien más! Gracias a la sugerencia Tushar :-)

autoUpdate.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

     @Override 
     public boolean onPreferenceChange(Preference preference, 
       Object newValue) { 
      boolean switched = ((SwitchPreference) preference) 
        .isChecked(); 
      update = !switched; 
      mEditor = mUpdate.edit(); 
      mEditor.putBoolean("update", update); 
      mEditor.commit(); 
      autoUpdate.setSummary(update == false ? "Disabled" : "Enabled"); 

      return true; 
     } 

    }); 
+0

¿Ha intentado utilizar setOnPreferenceChangeListener en su lugar? – Tushar

+0

Tushar, en realidad no lo he intentado. Déjame probarlo. Gracias. – tommytomatoe

+0

dime cómo va. Soy curioso. – Tushar

Respuesta

29

Uso setOnPreferenceChangeListener() en lugar de setOnPreferenceClickListener().

+7

¡Gracias de nuevo! Te llamaré +1 cuando obtenga 15 puntos de rep. – tommytomatoe

0

Si aún no ha descubierto una buena forma de hacerlo, he encontrado algo que no crea múltiples llamadas al onPreferenceChange que hace clic en la preferencia. Lo escribí en otra pregunta: dual functionality SwitchPreference.

5

Trabajando código

public static class SettingsFragment extends PreferenceFragment { 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref_notification); 

      SwitchPreference vibrateSwitch = (SwitchPreference) findPreference("notification_vibrate"); 

      if (vibrateSwitch != null) { 
       vibrateSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
        @Override 
        public boolean onPreferenceChange(Preference arg0, Object isVibrateOnObject) { 
         boolean isVibrateOn = (Boolean) isVibrateOnObject; 
         if (isVibrateOn) { 
          Vibrator v = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE); 
          v.vibrate(400); 
         } 
         return true; 
        } 
       }); 
      } 
     } 

}