2011-01-11 19 views
7

Ben PreferenceScreen s 2 seviyeli ağacı bulunan PreferenceActivity var gibi bir şey:PreferenceActivity güncelleme özeti

<PreferenceScreen> 
    <PreferenceScreen android:key="A"> 
    <ListPreference/> 
    <EditTextPreference/> 
    </PreferenceScreen> 
    <PreferenceScreen android:key="B"> 
    <ListPreference/> 
    <EditTextPreference/> 
    </PreferenceScreen> 
    ... 
</PreferenceScreen> 

alt düzey tercih ekranlarının her biri örneğin A ve B iki veri ilişkili parçalarını topluyor . Bu ana öğeler için özetin, iki alt tercihin mevcut değerlerinin bir kombinasyonu olması istiyorum.

Yaprak tercihlerinde onPreferenceChangeListener'ı eklemeyi ve özeti oradan güncelleştirmeyi denedim, ancak görünmüyor. tercihleri ​​tüm etkinliklerin içinde programlı oluşturulur, böylece onCreate böyle bir şey yapıyorum:

leafListPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
       // do some work 
       prefScreenA.setSummary(/* get new summary based on newValue */); 
       return true; 
     } 
    }); 

ben o zaman ben üst düzey tercihleri ​​ekrana döndü haberdar edilebileceği bir yer bulmaya çalıştılar Bir alt sayfadan, bu noktada güncelleyebilmem için. Ancak, alt seviye ekranların nasıl görüntülendiği konusunda kafam karıştı. Aslında diyaloglar gibi görünür, OnPause/onResume aralarında taşırken arandığından beri tam aktiviteler değildir. En üst seviyeye geri döndüğünüzde çağrılacak bir yer var mı?

Ayrıca, here açıklandığı gibi bir sharedPreferenceChangeListener eklemeyi denedim, ancak bu hiç çağrılmadı.

Burada eksik olduğum veya eksik olduğum herhangi bir yaklaşım hakkında herhangi bir ipucu var mı?

cevap

11

Aynı sorun vardı ve özeti değiştirildikten sonra sorunum Activity.onContentChanged() çağırıyor gibi görünüyor.

@Override 
public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    // Update summary value 
    EditTextPreference pref = (EditTextPreference)findPreference(key); 
    pref.setSummary(pref.getText()); 
    this.onContentChanged(); 
} 
+0

Öneriniz için teşekkürler. Bir süre önce bunun üzerinde çalışmayı bıraktım, ama bir şans bulduğumda bunu deneyeceğim. –

+0

Ne yazık ki bu benim için çalışmadı. –

+0

harika çalıştı, teşekkürler – Yahia

0

şu kodu kullanın ve

public class SettingsActivity extends PreferenceActivity 
    { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
      setContentView(R.layout.settings_layout); 


      } 

@Override 
    public void onContentChanged() { 
     // put your code here 
     super.onContentChanged(); 
    } 

} 

Umarım yardımcı olur() onContentChanged geçersiz kılar.

0

Bu problemle de karşılaştım ve sonunda dinleyiciden gelen değeri kullanarak bir çözüm buldum. Ben ilk ListPreference dizideki değerin indeksini almak (bir ListPreference için) aşağıda benim örnekte , o zaman ben bu dizini kullanarak değerin etiketi almak:

passwordFrequencyLP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      int newFrequency = Integer.valueOf(newValue.toString()); 

      prefs.edit().putInt("settings_key_password_frequency", newFrequency).commit(); 

      //get the index of the new value selected in the ListPreference array 
      int index = passwordFrequencyLP.findIndexOfValue(String.valueOf(newValue)); 
      //get the label of the new value selected 
      String label = (String) passwordFrequencyLP.getEntries()[index]; 

      passwordFrequencyLP.setSummary(label); 

      makeToast(getResources().getString(R.string.password_frequency_saved)); 
      return true; 
     } 
    }); 

Bu küçük hile, iyi çalışıyor ben Bu soruna birçok farklı olası çözüm bulmuş ancak sadece bu benim için çalışmıştır.

0

Gerçekten çok az miktarda deneme ve hatadan sonra, cevabı sonunda another SO answer numaralı telefondan buldum. İşte sihirli çizgi:

((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 

Bunu tercih dinleyicinize koyun, o zaman gitmekte fayda var.

İlgili konular