2013-04-18 8 views
7

Ich arbeite an benutzerdefinierten PreferenceScreen, ich habe einen benutzerdefinierten Bildschirm für die Einstellungen Seite mit PreferenceActivity erstellt.Dynamisch Daten von Custom PreferenceScreen ändern

Unten ist mein Einstellungsbildschirm.

enter image description here

Ausgabe: - Ich muss dynamisch Abzeichen von Download-Daten ändern. Ich folgte diesem question für dieses Layout zu erreichen. Ich habe schon alle Antwort auf diese Frage versucht, aber nicht funktioniert einzige Antwort.

Gibt es eine andere Möglichkeit, die Ansicht zu finden, die von innen bevorzugt wird?

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

posten Sie Ihre Einstellung XML-Datei Code – Pratik

+0

prüfen aktualisiert Frage ... Mein Code ist wie diese Frage gleich, zu dieser Frage aussehen .... –

+1

das in Ordnung sein wird für Dich Aktivität zu verwenden, anstatt Vorlieben – stinepike

Antwort

4

Sie können Preference Unterklasse überschreiben onBindDialogView() - nur nicht vergessen, die XML-Daten aus <Preference...> ändern Sie Ihr Paket und Klasse gehören <com.example.app.BadgedPreference...>:

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

Ihre BadgedPreference Wenn hat eine Methode, um Ihre Änderung zu handhaben, Sie können es ein bisschen einfacher verwenden - von innerhalb Ihrer PreferenceActivity:

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

Noch einfacher, können Sie einen Standard Preference verwenden können, nur die Zusammenfassung Feld als ‚Abzeichen‘ -Stil, dann können Sie den Wert mit dem mitgelieferten Ergebnisfeld:

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

Lass es mich wissen, wenn du irgendwelche Fragen hast.

+0

danke, ich hatte mit Präferenz-Klasse .. –

+0

Danke, froh Du hast es geschafft. :) – CodeShane

0

Sie können OnSharedPreferenceChangeListener So etwas wie dies umzusetzen:

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

Wenn Sie Standard-Preference verwenden Sie so etwas wie dies versuchen:

/** 
* 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())); 
     } 
    } 

} 

}

Wenn Sie benutzerdefinierte Einstellung verwenden, Sie können alles tun, und Sie können setSummary (int Wert)

0 überschreiben
@Override 
public void setSummary(int value) { 
    setSummary(String.valueOf(value)+" ...."); 
}