Как установить сводку настроек edittext и сохранить ее

Я вернулся и четвертый на этом, и я просто не могу получить его. Я устанавливаю свои настройки, используя фрагмент предпочтений. Я могу заставить настройки работать, и я могу даже обновить «сводку» при внесении изменений. Но если я выйду из экрана настроек и вернусь к нему, сводка вернется к тексту по умолчанию. Итак, вопрос в том, при использовании предпочтения edittext. Как обновить сводку, чтобы она показывала, на что пользователь изменил настройку, и заставляла ее оставаться при закрытии экрана и приложения? В этом случае, когда мои пользователи меняют mse_ip, сводка меняется на «MSE IP x.x.x.x», но как только я выхожу из экрана настроек и возвращаюсь, она возвращается к «0.0.0.0», что и является значением @string/mseip.

предпочтения.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">     
    <EditTextPreference
            android:key="mse_ip"
            android:title="MSE IP"
            android:summary="@string/mseip"
            android:defaultValue="0.0.0.0"
            android:dialogTitle="IP Address for mse" />
    <EditTextPreference
            android:key="mse_username"
            android:title="Username"
            android:summary="MSE Username %s"
            android:defaultValue="Admin"
            android:dialogTitle="Username for mse" />
    <EditTextPreference
            android:key="mse_password"
            android:title="MSE Password"
            android:password="true"
            android:summary="******"
            android:defaultValue="Admin"
            android:dialogTitle="Password for mse" />
</PreferenceScreen>

фрагмент предпочтений

package com.hmkcode.android;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;

/*public class PrefsFragment extends PreferenceFragment {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);

  // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
 } 
} */
public class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {

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

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    // set texts correctly
    onSharedPreferenceChanged(null, "");

}

@Override
public void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

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

    updatePreference(key); }
     private void updatePreference(String key){
            if (key.equals("mse_ip")){
                Preference preference = findPreference(key);
                if (preference instanceof EditTextPreference){
                    EditTextPreference editTextPreference =  (EditTextPreference)preference;
                    if (editTextPreference.getText().trim().length() > 0){
                        editTextPreference.setSummary("MSE IP  " + editTextPreference.getText());
                    }else{
                        editTextPreference.setSummary("MSE IP Not");
                    }
                }
            }
        }

}

установитьпредпочтительную активность

import android.os.Bundle;
import android.app.Activity;

public class SetPreferenceActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getFragmentManager().beginTransaction().replace(android.R.id.content,
            new PrefsFragment()).commit();

    //setContentView(R.layout.activity_set_preference);
}
 }

person user3423167    schedule 26.03.2014    source источник


Ответы (3)


Вы должны установить OnPreferenceChangeListener в соответствии с вашими предпочтениями. Таким образом, при каждом изменении предпочтений вызов setSummary изменяет отображение сводки. Это может быть пример кода:

final Preference pref = getPreferenceManager().findPreference(
                PREF_KEY);
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                pref.setSummary(newValue.toString());
                return true;
            }
        });

Вы также должны вызвать метод setSummary вашего предпочтения в onCreate(), чтобы в Summary отображалось ваше значение sharedPreference.

person Nick    schedule 16.03.2015

Используя библиотеку предпочтений androidx (см. официальные руководства), достаточно добавить следующий атрибут:

<EditTextPreference
    ...
    app:useSimpleSummaryProvider="true" />
person Mahozad    schedule 28.04.2019

Кажется, вы просто обновляете значение этого EditText. Попробуйте сохранить новое значение в общих настройках, вызвав

sharedPreferences.edit().putString(key, editTextPreference.getText()).apply();

Это можно вызвать в функции updatePreference(String key).

person Blehi    schedule 01.09.2014
comment
Интересный. К сожалению, это не текст строки с %$1s. - person Gunnar Bernstein; 16.12.2019