如何设置编辑文本偏好摘要,并有它坚持



我已经在这个问题上反复尝试了四次,但我就是不能得到它。我正在使用偏好片段设置我的设置。我可以让设置工作,我甚至可以让"摘要"更新当我做出改变。但如果我离开设置屏幕并回到它,摘要将恢复到默认文本。所以问题是,当使用edittext首选项时。如何更新摘要,让它显示用户更改设置的内容,并让它在关闭屏幕和应用程序时保持不变?在这种情况下,当我的用户更改mse_ip时,摘要更改为"MSE IP x.x.x.x",但一旦我离开设置屏幕并返回,它就会回到"0.0.0.0",这就是@string/mseip设置的值。

preferences.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>

preferencesfragment

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

setpreferenceactivity

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

通过使用androidx首选项库(参见官方指南),添加以下属性就足够了:

<EditTextPreference
    ...
    app:useSimpleSummaryProvider="true" />

你必须为你的Preference设置一个onpreferencechangellistener。等等每次首选项更改,调用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;
            }
        });

你应该在onCreate()中调用你的首选项的setSummary方法,以便Summary显示sharedPreference值。

似乎您只是更新了EditText的值。尝试通过调用

将新值存储在共享首选项中

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

可以在updatePreference(String key)函数中调用

最新更新