2015-12-15 2 views
7

Я научиться развиваться в Android и хотите сделать настройки активности,дисплей значение EditTextPreference в резюме

Мои настройки активности

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(); 


    } 


} 

и мой файл res/preferences.xml

<?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> 

Итак, теперь у меня есть активность для настройки активности. Но я хочу показать значение EditTextPref в android:summary. Я нашел много тем, но все функции были устаревшими.

EDIT: благодаря @Ace_McIntosh, я отредактировал свой код для людей, которые этого хотят, теперь он работает.

+1

Возможный дубликат [Как отобразить текущее значение Android-предпочтения в сводке предпочтений?] (Https://stackoverflow.com/questions/531427/how-do-i-display-the-current-value -of-an-android-preference-in-the-preference-su) –

ответ

3

Просто используйте setSummary method на желаемом объекте Preference. Вызовите его после возобновления фрагмента настроек для каждой записи, которую вы хотите обновить (т. Е. Все записи EditTextPreference в вашем случае) и зарегистрируйте OnSharedPreferenceChangeListener на конкретном объекте SharedPreferences (чтобы вы могли обновить сводку в случае ее изменения) - и передать ему желаемое значение EditTextPreference (которое вы можете получить с помощью метода getText()).

реализуйте ее в MyPreferenceFragment, как это (я не гарантирую, что он будет работать право летучей мыши, она служит цели, чтобы просто дать вам идею):

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

проблема заключается в том, что addPreferencesFromResource устарел. – user3130417

+2

Он устарел только в классе 'PreferenceActivity', вы должны вызвать его в классе' PreferenceFragment' (где он не устарел, как вы можете видеть [в документации] (http://developer.android.com/reference/ Android/предпочтения/PreferenceFragment.html # addPreferencesFromResource% 28int% 29)). Обязательно используйте фрагмент (вы не разместили его код, я вижу только, что вы создаете новый экземпляр «MyPreferenceFragment» в вашем классе активности). Также обратите внимание, что родительская активность «PreferenceFragment» не должна расширять «PreferenceActivity», это может быть просто обычная деятельность. –

+1

Выполнено, просто еще один вопрос, теперь у меня есть значение в сводке, но когда я его изменяю, мне нужно закрыть и открыть приложение, чтобы увидеть изменение, я googled, и я обнаружил, что мне нужно добавить 'setPreferenceScreen (null) ; addPreferencesFromResource (R.xml.preferences); ', но я не могу найти, где я должен его добавить. – user3130417

1

Там какая-то ошибки в пример отвечал выше, так что я думал, что я отправляю рабочий раствор (поддерживает ListPreference и MultiSelectListPreference а)

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

Ответ @ Serv-инк работал для меня. Как-то другие ответы работали только при изменении значения.

Но прежде, чем он работал, я должен был внести изменения, как показано ниже:

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

Это показывает значение, когда сначала отображается, когда значение изменяется, а также после того, как резюме.

+0

Вам нужно было изменить getSummary(), потому что для ответа @ serv-inc было установлено поле android: summary = "Фактическое значение:% s", которое будет использоваться для формата String. –

Смежные вопросы