2015-12-15 8 views
7

yılında EditTextPreference değerini gösterir ben bir Android'de geliştirmek ve ayar aktiviteyi yapmak istiyorum,Özetle

My ayar aktivitesini

public class Main extends Activity { 


    protected SettingsFragment settingsFragment; 


    @SuppressLint("NewApi") 
    @TargetApi(11) 
    public class SettingsFragment extends PreferenceFragment implements 
      SharedPreferences.OnSharedPreferenceChangeListener { 


     @Override 
     public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
      setSummaries(); 


     } 


     @Override 
     public void onResume() { 
      final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ; 
      super.onResume(); 
      sh.registerOnSharedPreferenceChangeListener(this); 

     } 

     @Override 
     public void onPause() { 
      final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ; 
      super.onPause(); 
      sh.unregisterOnSharedPreferenceChangeListener(this); 
     } 

     @SuppressLint("NewApi") 
     public void setSummaries(){ 

      final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ; 


      //Pref1 
      Preference stylePref = findPreference("editTextPref"); 
      stylePref.setSummary(sh.getString("editTextPref", "")); 

      //here the other preferences.. 
     } 


     @Override 
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
      if (key.equals("editTextPref")) { 
       Preference pref = settingsFragment.findPreference(key); 
       // Set summary to be the user-description for the selected value 
       pref.setSummary(sharedPreferences.getString(key, "")); 

      } 
      //here the others preferences 
     } 
    }//End fragment 

    @SuppressLint("NewApi") 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     settingsFragment = new SettingsFragment(); 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, settingsFragment) 
       .commit(); 


    } 


} 

ve benim res/preferences.xml dosya öğrenme

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


     <EditTextPreference 
      android:key="editTextPref" 
      android:title="Numero de telephone" 
      android:summary="This allows you to enter a string" 
      android:defaultValue="*"/> 

    </PreferenceCategory> 

</PreferenceScreen> 

Şimdi ayar etkinliği için aktivitem var. Ama ben EditTextPref değerini android:summary'da görüntülemek istiyorum. Birçok konu buldum ama tüm işlevler kullanımdan kaldırıldı.

DÜZENLEME: @Ace_McIntosh'a teşekkürler, bunu isteyen kişiler için kodumu düzenledim, şimdi çalışıyor.

+1

Olası kopyası [Tercihler Özetinde Android Tercihinin geçerli değerini nasıl gösteririm?] (Https://stackoverflow.com/questions/531427/how-do-i-display-the-current-value -of-an-android-tercih-in-the-tercihi-su) –

cevap

3

İstenen Tercih nesnesinde setSummary method'u kullanın. Güncellemek istediğiniz her giriş için ayar parçanızı devam ettirdiğinizde (yani, durumunuzdaki tüm EditTextPreference girişleri) ve beton SharedPreferences nesnesine bir OnSharedPreferenceChangeListener kayıt yaptırdıktan sonra tekrar çağırın (böylelikle değişmiş olması halinde özeti güncelleyebilirsiniz) - ve istediğiniz EditTextPreference değerini (getText() yöntemiyle edinebilirsiniz) iletin.

public class MyPreferenceFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 
    SharedPreferences sharedPreferences; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // load the preferences from your XML resource (which I assume you already do anyway) 
     addPreferencesFromResource(R.xml.preferences); 
    } 

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

     sharedPreferences = getPreferenceManager().getSharedPreferences(); 

     // we want to watch the preference values' changes 
     sharedPreferences.registerOnSharedPreferenceChangeListener(this); 

     Map<String, ?> preferencesMap = sharedPreferences.getAll(); 
     // iterate through the preference entries and update their summary if they are an instance of EditTextPreference 
     for (Map.Entry<String, ?> preferenceEntry : preferencesMap.entrySet()) { 
      if (preferenceEntry instanceof EditTextPreference) { 
       updateSummary((EditTextPreference) preferenceEntry); 
      } 
     } 
    } 

    @Override 
    public void onPause() { 
     sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); 
     super.onPause(); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
              String key) { 
     Map<String, ?> preferencesMap = sharedPreferences.getAll(); 

     // get the preference that has been changed 
     Object changedPreference = preferencesMap.get(key); 
     // and if it's an instance of EditTextPreference class, update its summary 
     if (preferencesMap.get(key) instanceof EditTextPreference) { 
      updateSummary((EditTextPreference) changedPreference); 
     } 
    } 

    private void updateSummary(EditTextPreference preference) { 
     // set the EditTextPreference's summary value to its current text 
     preference.setSummary(preference.getText()); 
    } 
} 
+3

sorun, addPreferencesFromResource kullanımdan kaldırılmıştır. – user3130417

+2

Yalnızca "PreferenceActivity" sınıfında kullanımdan kaldırılır, bunu "PreferenceFragment" sınıfında çağırmanız gerekir (burada belgelerde görüldüğü gibi (http://developer.android.com/reference/) android/tercih/PreferenceFragment.html # addPreferencesFromResource% 28int% 29)). Parçayı kullandığınızdan emin olun (kod yazmamışsınızdır, sadece aktivite sınıfınızda yeni bir "MyPreferenceFragment" örneği oluşturduğunuzu görüyorum). Ayrıca, 'PreferenceFragment' öğesinin ana etkinliğinin 'PreferenceActivity' değerini genişletmek zorunda olmadığını da unutmayın, bu yalnızca sıradan bir etkinlik olabilir. –

+1

Bitti, sadece başka bir soru, şimdi özette bir değer var ama onu değiştirdiğimde, değişikliği görmek için uygulamayı açmam ve yeniden açmalıyım, googleledim ve 'setPreferenceScreen (null) eklemem gerektiğini buldum ; addPreferencesFromResource (R.xml.preferences); 'ancak, onu eklemek zorunda olduğumu bulamıyorum. – user3130417

1

bazı hatalar var:

böyle senin MyPreferenceFragment bunu uygulamak (Ben yarasa hakkını çalışacağını garanti etmiyoruz, sadece size bir fikir vermek için bir amaca hizmet eder) örnek yüzden ben benim için çalıştı @ serv-inc bir çalışma çözeltisi (ListPreference ve yanı MultiSelectListPreference destekler)

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 

private SharedPreferences sharedPreferences; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.settings); 
} 

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

    sharedPreferences = getPreferenceManager().getSharedPreferences(); 
    sharedPreferences.registerOnSharedPreferenceChangeListener(this); 

    PreferenceScreen preferenceScreen = getPreferenceScreen(); 
    for(int i = 0; i < preferenceScreen.getPreferenceCount(); i++) { 
     setSummary(getPreferenceScreen().getPreference(i)); 
    } 
} 

@Override 
public void onPause() { 
    sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); 
    super.onPause(); 
} 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    Preference pref = getPreferenceScreen().findPreference(key); 
    setSummary(pref); 
} 

private void setSummary(Preference pref) { 
    if (pref instanceof EditTextPreference) { 
     updateSummary((EditTextPreference) pref); 
    } else if (pref instanceof ListPreference) { 
     updateSummary((ListPreference) pref); 
    } else if (pref instanceof MultiSelectListPreference) { 
     updateSummary((MultiSelectListPreference) pref); 
    } 
} 

private void updateSummary(MultiSelectListPreference pref) { 
    pref.setSummary(Arrays.toString(pref.getValues().toArray())); 
} 

private void updateSummary(ListPreference pref) { 
    pref.setSummary(pref.getValue()); 
} 

private void updateSummary(EditTextPreference preference) { 
    preference.setSummary(preference.getText()); 
} 
} 
0

Cevap sonrası düşünce yukarıda yayınlanmıştır. Bir şekilde diğer cevaplar sadece değer değiştiğinde çalıştı.

@Override 
public CharSequence getSummary() { 
    return getText(); 
} 

O zaman değer değişikliklerinin yanı sıra özgeçmiş sonra, başlangıçta görüntülendiğinde değerini gösterir: o amele önce

Ama aşağıda bir değişiklik yapmak zorunda kaldı.

+0

getSummary() 'ı değiştirmek zorundaydınız çünkü @ serv-inc cevabı android: summary = "Gerçek değer:% s" alanı bir String formatı için kullanılacak şekilde ayarlanmıştı. –

İlgili konular