2012-04-12 3 views
15

Obwohl es dokumentiert wird, indem ich "%s" verwende, kann ich ausgewählten Wert als Zusammenfassung anzeigen, es funktioniert nicht wie erwartet.ListPreference Zusammenfassungstext wird nicht automatisch aktualisiert, wenn es eine Änderung in Auswahl gibt

http://developer.android.com/reference/android/preference/ListPreference.html#getSummary%28%29

ich folgende preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory 
     android:title="@string/preference_xxx_category"> 
     <CheckBoxPreference 
      android:title="@string/preference_xxx_mode_title" 
      android:defaultValue="false" 
      android:summary="@string/preference_xxx_mode_summary" 
      android:key="xxxModePreference" /> 
    </PreferenceCategory> 

    <PreferenceCategory 
     android:title="@string/preference_yyy_category"> 
     <ListPreference 
      android:title="@string/preference_yyy_mode_title" 
      android:defaultValue="0" 
      android:entries="@array/yyy" 
      android:entryValues="@array/yyy_values" 
      android:summary="%s" 
      android:key="yyyModePreference" />   
    </PreferenceCategory> 

</PreferenceScreen> 

habe und hier ist mein arrays.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="yyy"> 
     <item>Display value 0</item> 
     <item>Display value 1</item> 
    </string-array> 

    <string-array name="yyy_values"> 
     <item>0</item> 
     <item>1</item> 
    </string-array>  
</resources> 

Was den folgenden Java-Code, indem ich erwarte eine vollständige Präferenz Aktivität zu bauen, Mit einem Kontrollkästchen und einer Listenpräferenz kann der Übersichtstext der Listenpräferenz automatisch aktualisiert werden, wenn Ich führe immer eine Auswahl durch. Der zusammenfassende Text schaltet zwischen um. Anzeigewert 0 und Anzeigewert 1.

Allerdings merke ich die Zusammenfassung Text für Listenpräferenz wird nicht automatisch aktualisiert. Nur wenn ich das Kontrollkästchen aktiviere/deaktiviere, wird nur die gesamte Aktivität ungültig und der Übersichtstext für die Listenpräferenz wird NUR aktualisiert.

Daher muss ich meinen Code wie folgt überarbeiten, die mehr umständlich aussieht.

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
     PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); 
    } 

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

     // Cumbersome way to make sure list preference's summary text is being updated. 
     final String key = "yyyModePreference"; 
     ListPreference listPreference = (ListPreference)findPreference(key); 
     final String value = PreferenceManager.getDefaultSharedPreferences(this).getString(key, key); 
     final int index = listPreference.findIndexOfValue(value); 
     if (index >= 0) { 
      final String summary = (String)listPreference.getEntries()[index];   
      listPreference.setSummary(summary); 
     } 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences options, String key) { 
     // Cumbersome way to make sure list preference's summary text is being updated. 
     if (key.equals("yyyModePreference")) { 
      ListPreference listPreference = (ListPreference)findPreference(key); 
      final String value = options.getString(key, key); 
      final int index = listPreference.findIndexOfValue(value);    
      if (index >= 0) { 
       final String summary = (String)listPreference.getEntries()[index];   
       listPreference.setSummary(summary); 
      } 
     } 
    } 
} 

Ist das ein richtiger Weg? Gibt es einen vereinfachten Weg, um sicherzustellen, dass der Übersichtstext von ListPreference immer automatisch aktualisiert wird, wenn die Auswahl geändert wird.

+0

Danke, es hätte lange gedauert, das herauszufinden. – Gerhard

+0

mögliches Duplikat von [Ändern Sie die Zusammenfassung einer ListPreference mit dem neuen Wert (Android)] (http://stackoverflow.com/questions/7017082/change-the-summary-of-a-listpreference-with-the-new- Wert-android) – CAMOBAP

Antwort

24

Dies ist ein Fehler, der auf Plattformen vor KITKAT (dh Android-4.4_r0.7) existiert, und es festgelegt ist durch 94c02a1

Die Lösung von @ilomambo Werke zu begehen, aber die beste kann nicht sein, . Ich lese durch die Quelle von und kam mit dieser Lösung:

Datei: ListPreferenceCompat.

java
package com.example.yourapplication; 

import android.content.Context; 
import android.os.Build; 
import android.preference.ListPreference; 
import android.text.TextUtils; 
import android.util.AttributeSet; 

public class ListPreferenceCompat extends ListPreference { 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public ListPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public ListPreferenceCompat(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public ListPreferenceCompat(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ListPreferenceCompat(Context context) { 
     super(context); 
    } 

    // NOTE: 
    // The framework forgot to call notifyChanged() in setValue() on previous versions of android. 
    // This bug has been fixed in android-4.4_r0.7. 
    // Commit: platform/frameworks/base/+/94c02a1a1a6d7e6900e5a459e9cc699b9510e5a2 
    // Time: Tue Jul 23 14:43:37 2013 -0700 
    // 
    // However on previous versions, we have to workaround it by ourselves. 
    @Override 
    public void setValue(String value) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      super.setValue(value); 
     } else { 
      String oldValue = getValue(); 
      super.setValue(value); 
      if (!TextUtils.equals(value, oldValue)) { 
       notifyChanged(); 
      } 
     } 
    } 
} 

Wenn Sie benötigen ListPreference in XML verwenden, ersetzen Sie einfach den Tag zu com.example.yourapplication.ListPreferenceCompat.

Dies funktioniert gut auf meinem Samsung S4-Gerät mit Android 4.3 und in einer meiner Produktion App.

+0

Danke dafür, es funktioniert perfekt! –

+0

Danke, du ersparst mir viel langweiliges Zeug !! –

6

Ich denke, seine eine Art von einem seltsamen Fehler, weil ich es auf Emulator getestet habe mit Android 2.3.3 und es hat nicht funktioniert, aber wenn ich es auf 4.0.3 getestet hat es funktioniert. Was ich getan habe, war android:summary="%s" in xml für ListPreference und das ist alles.

+1

es ist kein Fehler. Es ist ein Feature, das in API Level 15 (oder vielleicht 14) hinzugefügt wurde. – Ran

+0

danke @Waqas für das Hinweisen, vor einer Woche googelte ich eine viel mehr beteiligt Antwort, wo ein Listener angefügt werden musste und die Zusammenfassung programmgesteuert, um das gleiche zu tun. – sonjz

1

IMHO ist es ein Fehler. Die OnClickListener() definiert in ListPreference.java#builder.setSingleChoiceItems() nicht notifyChanged()

ich meine eigenen ListPreference werden passieren Codierung auf der Grundlage dieser Code nicht nennen, und lief über das gleiche Problem wie die OP, habe ich notifyChanged():

  ... 
      dialog.dismiss(); 
      notifyChanged(); // <<<<<<<<<< 
     } 
}); 

und Jetzt wird die Präferenzzusammenfassung aktualisiert, sobald ich sie auswähle. Es ist nicht abhängig von der Android-Version, ListPreference wurde seit dieser Zeit so codiert.

Verwandte Themen