2013-04-18 13 views
7

Pracuję nad niestandardowym PreferenceScreen, utworzyłem niestandardowy ekran strony ustawień, używając PreferenceActivity.Dynamicznie zmieniaj dane niestandardowego ekranu preferencji

Poniżej znajduje się ekran moich preferencji.

enter image description here

Issue: - muszę zmienić odznakę Pobierz dane dynamicznie. Poszedłem za tym question, aby osiągnąć ten układ. Próbowałem już wszystkie odpowiedzi na to pytanie, ale nie działa pojedyncza odpowiedź.

Czy istnieje inny sposób znalezienia widoku, który jest w środku preferencji?

settings.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

<Preference android:title="@string/settings_user_profile" android:key="user_profile" android:summary="@string/settings_user_profile_desc" android:layout="@layout/setting_list"></Preference> 
<Preference android:title="@string/settings_download" android:key="download_data" android:summary="@string/settings_download_desc" android:layout="@layout/setting_list"></Preference> 
</PreferenceScreen> 
+0

zamieścić swoje ustawienie kodu xml file – Pratik

+0

Sprawdź zaktualizowaną pytanie ... Moje kodu jest taka sama jak to pytanie, spójrz na to pytanie .... –

+1

to będzie w porządku, aby korzystać aktywność zamiast preferencji – stinepike

Odpowiedz

4

Można podklasy Preference, nadrzędnymi onBindDialogView() - pamiętaj tylko, aby zmienić XML z <Preference...> obejmuje pakiet i klasę <com.example.app.BadgedPreference...>:

@Override 
protected void onBindDialogView(View v) { 
    super.onBindDialogView(v); 
    Log.v("onBindDialogView()", v.getClass().getSimpleName()); 
} 

Jeśli BadgedPreference ma metodę radzenia sobie ze zmianą, możesz jej użyć nieco łatwiej - z poziomu twojego PreferenceActivity:

PreferenceScreen myPrefScreen = (PreferenceScreen)getPreferenceScreen(); 
BadgedPreference bp = (BadgedPreference)myPrefScreen.findPreference("download_data"); 
// Custom method 
bp.setBadgeValue(12); 

Jeszcze prościej, można użyć standardowego Preference, tylko styl jego pole Podsumowanie jako „odznaką”, można ustawić wartość przy użyciu pola dołączonego Podsumowanie:

Preference pref = (Preference)myPrefScreen.findPreference("download_data"); 
pref.setSummary("12"); 

Daj mi znać, jeśli masz jakieś pytania.

+0

dzięki, zrobiłem z Preference klasy .. –

+0

Dzięki, cieszę się udało ci się to wypracować. :) – CodeShane

0

można zaimplementować OnSharedPreferenceChangeListener coś takiego:

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

     // Set up a listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
     .registerOnSharedPreferenceChangeListener(this);   
    } 

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

     // Unregister the listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
     .unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
     String key) { 

     //update summary 
     updatePrefsSummary(sharedPreferences, findPreference(key)); 
    } 

Jeśli używasz standardowego Preference można spróbować coś takiego:

/** 
* Update summary 
* 
* @param sharedPreferences 
* @param pref 
*/ 
protected void updatePrefsSummary(SharedPreferences sharedPreferences, 
    Preference pref) { 

if (pref == null) 
    return; 

if (pref instanceof ListPreference) { 
    // List Preference 
    ListPreference listPref = (ListPreference) pref; 
    listPref.setSummary(listPref.getEntry()); 

} else if (pref instanceof EditTextPreference) { 
    // EditPreference 
    EditTextPreference editTextPref = (EditTextPreference) pref; 
    editTextPref.setSummary(editTextPref.getText()); 

} else if (pref instanceof MultiSelectListPreference) { 
    // MultiSelectList Preference 
    MultiSelectListPreference mlistPref = (MultiSelectListPreference) pref; 
    String summaryMListPref = ""; 
    String and = ""; 

    // Retrieve values 
    Set<String> values = mlistPref.getValues(); 
    for (String value : values) { 
     // For each value retrieve index 
     int index = mlistPref.findIndexOfValue(value); 
     // Retrieve entry from index 
     CharSequence mEntry = index >= 0 
       && mlistPref.getEntries() != null ? mlistPref 
       .getEntries()[index] : null; 
     if (mEntry != null) { 
      // add summary 
      summaryMListPref = summaryMListPref + and + mEntry; 
      and = ";"; 
     } 
    } 
    // set summary 
    mlistPref.setSummary(summaryMListPref); 

} else if (pref instanceof RingtonePreference) { 
    // RingtonePreference 
    RingtonePreference rtPref = (RingtonePreference) pref; 
    String uri; 
    if (rtPref != null) { 
     uri = sharedPreferences.getString(rtPref.getKey(), null); 
     if (uri != null) { 
      Ringtone ringtone = RingtoneManager.getRingtone(
        getActivity(), Uri.parse(uri)); 
       pref.setSummary(ringtone.getTitle(getActivity())); 
     } 
    } 

} 

}

Jeśli używasz niestandardowego preferencji, możesz zrobić wszystko i możesz przesłonić setSummary (wartość int)

@Override 
public void setSummary(int value) { 
    setSummary(String.valueOf(value)+" ...."); 
} 
Powiązane problemy