2016-04-20 20 views
6

PreferenceActivity öğesini "Preferences" adlı bir alt sınıfla genişleten eski kodum var. OnSharedPreferenceChangeListener bulunmaktadırPreferenceActivity nasıl kullanılır veya "bulunur"?

Intent intent = new Intent(this, Preferences.class); 
    this.startActivity(intent); 

bir fragmanı (değil PreferenceActivity alt sınıfı), ancak/Özel bir tercih niteliklerini değiştirmek, aşağıdakine benzer kontrol etmek amacıyla PreferenceActivity başvuru ihtiyacı olan bir aşağıdaki gibi PreferenceActivity çağrılır: Burada "prefActivity" PreferenceActivity öğesine yapılan referanstır. Bir tercih oluşturulduğunda PreferenceActivity'ye bir referansı nasıl kaydedeceğinizi veya gerektiğinde PreferenceActivity'yi nerede bulabileceğini önerebilir mi?

DÜZENLEME: Hiyerarşileri göstermeye ve netleştirmeye yardımcı olmak için çok fazla basitleştirilmiş kod da dahil olmak üzere.

FragmentActivity CPActivity, CPFragment öğesini başlatır ve isteğe bağlı olarak (bir tuşa basma) PreferenceActivity alt sınıfını ("Tercihler" olarak adlandırılır) çıkarmak için bir Niyet oluşturur.

public class CPActivity extends FragmentActivity 
{ 
public static CPActivity inst; 
private CPFragment mFragmentCP; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    inst = this; 
    mFragmentCP = new CPFragment(); 
    } 

    public void onSettingsButtonPressed() { 
    // Bring up the Preferences menu 
    Intent intent = new Intent(this, Preferences.class); 
    this.startActivity(intent); 
    } 
} 

CPFragment, paylaşılan tercih dinleyicimizdir (diğer şeylerin yanı sıra). Bu kodda, özel bir tercih denetimi/girdisini (yani tercih değerinin kendisi değil, tercih denetimindeki öznitelikler, örneğin bir CheckBoxPreference) değiştirmek istediğimiz yer burasıdır. Burada yapmak isteriz, çünkü ilgili verilerin hesaplandığı yer burasıdır.

public class CPFragment extends Fragment implements OnSharedPreferenceChangeListener 
{ 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    // In response to preference changes, we want to modify the PreferenceActivity controls. 
    // So it seems we would need a reference to the PreferenceActivity subclass "Preferences 
    } 
} 

Ve nihayet, PreferenceActivity alt sınıf "Tercihler" does biraz daha Ayarlar görünümü getirmek daha.

public class Preferences extends PreferenceActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences_cp); 
    } 
} 

Ben de belirtildiği gibi, biz (PreferenceActivity aksine) CPFragment bulunan Özel Tercihi değiştirmek edebilmek için tercih ediyorum. Bu nedenle, CPFragment'te onSharedPreferenceChangeListener olarak yanıt verirken PreferenceActivity değerini bulmanın bir yolunu arıyordum.

+0

Sanırım sorularınız belirsiz olduğundan aşağıya iniyorsunuz. Lütfen ne sorduğunuzu açıklığa kavuşturun. "Tercihler" etkinliğinizi bir "Fragment" den güncellemeye mi çalışıyorsunuz? Aktiviteden de bir “OnSharedPreferenceChangeListener” kaydedebilirsiniz. –

+0

Hmmm ... belirsiz ne olduğundan emin değilim, "OnSharedPreferenceChangeListener başka bir parçada (PreferenceActivity alt sınıfında değil) var". Ama bu diğer parçada özel bir tercih değiştirmeniz gerekiyor. Bu nedenle, özel tercihi değiştirmek için PreferenceActivity'e bir şekilde ihtiyacım var. –

cevap

4

Sorunuzu doğru bir şekilde anlıyorsam, ActivityPreferences adlı extendsPreferenceActivity. Ayrıca, bir OnSharedPreferenceChangeListener kayıt olan bir Fragment var. Kullanıcı Arabirimini PreferencesActivity içinde güncellemeniz gerekir, ancak bunun nasıl gerçekleştirileceğinden emin değilsiniz.

PreferencesActivity eki mi?

Ayrıca PreferencesActivity bir OnSharedPreferenceChangeListener üye olarak alacak:

if (getActivity() instanceof Preferences) { 
    Preferences activity = (Preferences) getActivity(); 
    CheckBoxPreference pref = (CheckBoxPreference) activity.findPreference(getString(R.string.keyAccount)); 
    pref.setSummary("something"); 
} 

diğer yaklaşım: Eğer durum bu ise, o zaman Fragment yılında aşağıdakileri yapmanız gerekir Tercih değiştiğinde bildirilir.Örnek:

public class Preferences extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 

    /* ... */ 

    @Override protected void onStart() { 
    super.onStart(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (key.equals(getString(R.string.keyAccount))) { 
     CheckBoxPreference pref = (CheckBoxPreference) findPreference(key); 
     pref.setSummary("something"); 
    } 
    } 

    @Override protected void onPause() { 
    super.onPause(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 
    } 

    /* ... */ 

} 

Bazı şeyler Düzenlenen Yanıta göre düşünün için:

1) sizin Activity bir static referans oluşturmak etmeyin. public static CPActivity inst;. Bu, bellek sızıntılarına yol açabilir.

2) senin PreferencesActivity bir PreferenceFragment kodu taşımayı düşünün.

3) Hala neyi başarmaya çalıştığınız açık değil. CPFragment veya PreferencesActivity içinde değiştirmek istediğiniz CheckBoxPreference mu?

4) İki OnSharedPreferenceChangeListener s veya bir EventBus kullanmayı düşünmeniz gerekir.

+0

Sorunun anlaşılması doğrudur. PreferenceActivity'i başlatan startActivitesini kullanan bir FragmentActivity var. "Başka bir yaklaşım" önerinizle ilgili olarak, PreferenceActivity alt sınıfında bir OnSharedPreferenceChangeListener kaydetmenin Bounty yayınında bahsetmiştim iyi bir seçenek değildi. –

+0

Üzgünüm, hiçbir parça PreferenceActivity'ye eklenmedi. StartEtkinlik çağrıldığında PreferenceActivity'ye bir başvuru kaydetmek için başka bir seçenek olacağını düşünüyorum ... ama bunu nasıl yapacağımı anlamıyorum. –

+0

Hem "Fragment" hem de "Activity" öğesinin bir "OnSharedPreferenceChangeListener" kaydedebilirsiniz. Ön planda olmayan bir "Etkinlik" e başvurmak iyi bir fikir değildir. Bazı kodlar göndermelisiniz, aksi takdirde başka nasıl yardım edeceğimi bilmiyorum. –

İlgili konular