2012-06-13 3 views
28

Я всю ночь ломаю мозги, но, похоже, не могу выполнить эту маленькую вещь. Я хотел бы добавить SwitchPreference в мою PreferenceActivity приложения. Ниже приведена картина.SwitchPreference onChecked/onClick Listener

Прежде чем говорить слишком много, моя проблема заключается именно в этом: я не могу показаться, что слушаю только часть переключателя предпочтений. Я могу установить onPreferenceTreeClick и onPreferenceClick в предпочтении, и это отлично работает, если я нажимаю на текстовую часть. Но когда сам переключатель ничего не делает, когда я меняю его с OFF на ON.

Я прочитал документацию по адресу SwitchPreference. Я также посмотрел на android/packages/Settings, и похоже, что AOSP использует Switch, а не SwitchPreference для Wi-Fi и Bluetooth.

Вот моя попытка (работает, если вы нажмете на весь элемент предпочтения, но если вы просто нажать переключатель):

Пример:

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

Так повторить свой вопрос в случае, если я потерял тебя. Как установить слушателя на коммутационную часть SwitchPreference? Пожалуйста, будь добр, если это так очевидно. Это было довольно поздно прошлой ночью, когда я попытался добавить это.

Большое вам спасибо.

Примечания: 1. Я не против придерживаться CheckBoxPreference, но я предпочитаю использовать Switch, потому что он выглядит красиво.

  1. Да, я знаю, что есть легче/лучше? способ добавления динамических предпочтений с использованием res/xml и res/xml-v14 вместо проверки SDK. Я просто сделал это для тестирования.

picture of preference screen

EDIT

Надеется, что это помогает кто-то другое! Спасибо 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

Вы пробовали использовать setOnPreferenceChangeListener вместо этого? – Tushar

+0

Тушар, на самом деле я этого не пробовал. Позволь мне отдать это. Спасибо. – tommytomatoe

+0

расскажи мне, как это происходит. Мне любопытно. – Tushar

ответ

29

Использование setOnPreferenceChangeListener() вместо setOnPreferenceClickListener().

+7

Еще раз спасибо! Я добавлю +1, когда получу 15 очков. – tommytomatoe

0

Если вы все еще не поняли хороший способ сделать это, я понял что-то, что не создает несколько звонков onPreferenceChange, которые щелкают предпочтение. Я написал это в другом вопросе: dual functionality SwitchPreference.

5

Рабочий код

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

} 
Смежные вопросы