2011-07-17 7 views
9

Tercihlerim'in hepsi bir değişiklikten sonra onSharedPreferenceChanged olayını tetikler. Tüm tercihler için çalışır: Checkbox, List, custom, vb. Ama RingtonePreference'dan bir zil sesi seçersem çağrılmaz. yöntemini ulaşmak, RingtonePreference hariçRingtonePreference onharedPreference onSharedPreferenceChanged

public class TimePrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    context = this; 

    addPreferencesFromResource(R.layout.preferences);   

    Preference dbPref = (Preference) findPreference("prefDeleteDb");  
    dbPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { 

     public boolean onPreferenceClick(Preference preference) 
     { 
      showWipeDbDialog(); 
      return true; 
     } 
    }); 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.registerOnSharedPreferenceChangeListener(this); 

    toggleEnableList(); 
} 

@Override 
public void onPause() { 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 

    super.onPause(); 
} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) 
{ 
    boolean enabled = toggleEnableList();   

    if (enabled) 
    { 
     OnBootReceiver.setAlarm(TimePrefsActivity.this);     
    } 
    else 
    { 
     OnBootReceiver.cancelAlarm(TimePrefsActivity.this); 
    } 
} 
} 

tüm tercihleri ​​onSharedPreferenceChanged:

<CheckBoxPreference android:title="@string/pref_notification" 
     android:defaultValue="true" android:summary="@string/pref_notification_summary" 
     android:key="prefNotification" /> 
    <RingtonePreference android:title="@string/pref_ringtone" 
      android:key="prefRingtone" 
      android:summary="@string/pref_ringtone_summary" android:ringtoneType="all" /> 
    <CheckBoxPreference android:title="@string/pref_vibrate" 
     android:defaultValue="true" android:summary="@string/pref_vibrate_summary" 
     android:key="prefVibrationOn" /> 
    <ListPreference android:title="@string/pref_notification_interval" 
     android:summary="@string/pref_notification_interval_summary" 
     android:key="prefNotificationInterval" android:defaultValue="60" 
     android:entries="@array/prefs_interval" android:entryValues="@array/prefs_interval_values" /> 

Ve sınıf: Bu kodu vardır. Bir fikri olan var mı? Teşekkürler.

cevap

13

Android sisteminde bir hata gibi görünen aynı sorunla uğraştım. Kod hata ayıklandıktan sonra dinleyici, ListPreference gibi diğer sınıfların aksine, RingtonePreference dinleyici haritasına eklenmediğini fark ettim.

I opened a ticket, ancak şimdilik OnPreferenceChangeListener kullanarak üstesinden gelmenin bir yolunu buldum. Kodum, tercih özetini seçilen zil sesine göre ayarlar, bunun yerine mantığınızı kullanabilirsiniz.

İlk etkinlik OnPreferenceChangeListener uygulamak yapmak ve seçilen verileri almak için newValue parametresini kullanmanız gerekir, onPreferenceChange yöntemini onSharedPreferenceChanged aksine onPreferenceChange önce tercihi güncellendiğinde denir

@Override 
public boolean onPreferenceChange(Preference preference, Object newValue) { 
    updateRingtoneSummary((RingtonePreference) preference, Uri.parse((String) newValue)); 
    return true; 
} 

private void updateRingtoneSummary(RingtonePreference preference, Uri ringtoneUri) { 
    Ringtone ringtone = RingtoneManager.getRingtone(this, ringtoneUri); 
    if (ringtone != null) 
     preference.setSummary(ringtone.getTitle(this)); 
    else 
     preference.setSummary("Silent"); 
} 

Bildirimi yazma tercihinden almak yerine.

Sonra OnResume üzerinde dinleyici ayarlayın: Bu yardımcı olur

@Override 
protected void onResume() { 
    super.onResume(); 

    // A patch to overcome OnSharedPreferenceChange not being called by RingtonePreference bug 
    RingtonePreference pref = (RingtonePreference) findPreference(getString(R.string.pref_ringtone)); 
    pref.setOnPreferenceChangeListener(this); 

} 

Umut.

+1

teşekkür: –

9

Bunun ilk başta sistemde bir hata olduğunu düşündüm, ancak sorun aslında daha incelikli. RingtonePreference, bir amaç aracılığıyla yeni bir etkinlik başlattı. Bu, PreferenceActivity'inizin duraklatıldığı anlamına gelir. Ve dinleyicinizi onPause() 'da kaydetmiyorsunuz. Bunu yapmazsanız, iyi çalışır (en azından benim için yapar).

Ancak doğal olarak, işleyicinizin sonsuza kadar kayıtlı kalmasını sağlayamazsınız. OnResume()/onPause() yerine onStart()/onStop() kullanarak tehlikeye attım. , Beni deli oldu bu hatayı işaret için

Preference notificationSoundPref = findPreference(Constants.PREFS_NOTIFICATION_SOUND); 
    notificationSoundPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      // do what you need here 
      return true; 
     } 
    }); 
+0

' da başlangıç ​​değerlerini kuruyorsanız, bu cevap için teşekkür ederiz. İşaret ettiğin gibi, Android'in en iyi uygulamalarını izliyordum, dinleyiciyi kaydetmek/kaydını kaldırmak için onResume()/onPause() kullanmaktır. Önerdiğiniz gibi kayıt/kayıt kaydını onStart()/onStop() olarak değiştirdim ve şimdi güzel çalışıyor! –

+0

"RingtonePreference" bir niyet başlattığı için, diğer sorun "onActivityResult" geçersiz kılma olabilir.“PreferenceActivity” ve “onActivityResult” öğesinden başlattığım bir başka etkinliğim vardı. – ashishduh

0

el benim SettingsFragment üzerinde OnPreferenceChangeListener kendim ayarlamak zorunda kaldı. Ancak, eğer onResume() `inizde zaten başlangıçtaki 'özet' değerlerini kuruyorsanız (muhtemelen öncelikle 'PreferenceActivity' girerek mevcut ayarları görmek istediğinizden), sonra gittiğinizde farkettim. Açılan iletişim kutusundan yeni bir Zil sesi seçmek için, iletişim kutusunun kapatılmasından sonra `PreferenceActivity` nin onResume'i tekrar çağrılır ve Zil sesi tercihinin özeti güncellenir. Bu yüzden bu çözümü kullanmak için, 'onResume`