【问题标题】:How to set edittext preference summary and have it stick如何设置edittext首选项摘要并坚持下去
【发布时间】:2014-05-04 07:17:18
【问题描述】:

我已经回到第四次了,我就是无法理解。我正在使用首选项片段设置我的设置。我可以使设置正常工作,甚至可以在进行更改时更新“摘要”。但是,如果我离开设置屏幕并返回它,摘要将恢复为默认文本。所以问题是,当使用 edittext 首选项时。您如何更新摘要以显示用户将设置更改为的内容并使其在关闭屏幕和应用程序时保持不变?在这种情况下,当我的用户更改 mse_ip 时,摘要更改为“MSE IP xxxx”,但一旦我离开设置屏幕并返回,它就会返回到“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>

偏好片段

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

【问题讨论】:

    标签: android android-edittext preference summary


    【解决方案1】:

    您必须将 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;
                }
            });
    

    您还应该在 onCreate() 中调用您偏好的 setSummary 方法, 以便 Summary 显示您的 sharedPreference 值。

    【讨论】:

      【解决方案2】:

      通过使用androidx preference library(见official guides),添加以下属性就足够了:

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

      【讨论】:

        【解决方案3】:

        看来您只是更新了那个 EditText 的值。尝试通过调用将新值存储在共享首选项中

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

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

        【讨论】:

        • 有趣。不幸的是,它不在带有 %$1s 的字符串文本中。
        猜你喜欢
        • 1970-01-01
        • 2012-10-03
        • 2015-07-13
        • 1970-01-01
        • 2013-02-27
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多