2012-06-13 37 views
28

Tôi đã bỏ bộ não của mình suốt đêm nhưng dường như không thể hoàn thành được một điều nhỏ nhặt này. Tôi muốn thêm một SwitchPreference vào PreferenceActivity của một ứng dụng. Dưới đây là một hình ảnh.SwitchPreference onChecked/onClick Listener

Trước khi tôi nói quá nhiều, vấn đề của tôi là chính xác điều này: Tôi dường như không thể đặt người nghe chỉ trên phần Chuyển đổi của tùy chọn. Tôi có thể thiết lập một onPreferenceTreeClick và onPreferenceClick trên sở thích, và nó hoạt động tốt nếu tôi nhấn vào phần văn bản. Nhưng khi bản thân Switch không làm gì khi tôi thay đổi nó từ OFF thành ON.

Tôi đã đọc tài liệu trên SwitchPreference. Tôi cũng đã xem android/packages/Settings và có vẻ như AOSP sử dụng Switch và không phải là SwitchPreference cho Wi-Fi và Bluetooth.

Đây là nỗ lực của tôi (làm việc nếu bạn nhấn trên toàn bộ mục ưu tiên, nhưng không phải nếu bạn chỉ cần nhấn Switch):

mẫu:

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

Vì vậy, để nhắc lại câu hỏi của tôi trong trường hợp tôi mất bạn. Làm thế nào để thiết lập một người nghe trên phần Switch của SwitchPreference? Hãy tử tế nếu nó là một cái gì đó rất rõ ràng. Đêm qua đã khá muộn khi tôi cố thêm cái này.

Cảm ơn bạn rất nhiều trước.

Ghi chú: 1. Tôi không phản đối việc gắn bó với CheckBoxPreference, nhưng tôi thích sử dụng Chuyển đổi hơn vì nó trông đẹp mắt.

  1. Vâng tôi biết có dễ hơn/tốt hơn không? cách thêm tùy chọn động bằng cách sử dụng res/xml và res/xml-v14 thay vì thực hiện kiểm tra SDK. Tôi chỉ làm điều đó để thử nghiệm.

picture of preference screen

EDIT

Hy vọng rằng đây sẽ giúp người khác! Cảm ơn Tushar vì đã đề xuất :-)

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

Bạn đã cố gắng sử dụng setOnPreferenceChangeListener để thay thế? – Tushar

+0

Tushar, thực ra tôi chưa thử điều đó. Để tôi đi. Cảm ơn bạn. – tommytomatoe

+0

cho tôi biết cách thực hiện. Tôi tò mò. – Tushar

Trả lời

29

Sử dụng setOnPreferenceChangeListener() thay vì setOnPreferenceClickListener().

+7

Cảm ơn bạn một lần nữa! Tôi sẽ +1 bạn khi tôi nhận được 15 điểm đại diện. – tommytomatoe

0

Nếu bạn vẫn chưa tìm ra cách tốt để thực hiện việc này, tôi đã tìm ra điều gì đó không tạo ra nhiều cuộc gọi đến onPreferenceChange nhấp vào tùy chọn. Tôi đã viết nó trong một câu hỏi khác: dual functionality SwitchPreference.

5

đang làm việc

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

} 
Các vấn đề liên quan