如何在 android 中更新首选项摘要

How to update a preference summary in android

在我的应用程序的设置页面中有两个 EditTextPreference (s) 当我更改值时,必须更新摘要。现在,只要我在 EditTextPreference (s) 中输入值并点击确定,它就会更新摘要。但是当我重新启动应用程序时,摘要会变回默认值。但是新值保留在 EditTextPreference 中(我打开它时可以看到)。当我在 EditTextPreference 中输入新值时,摘要会再次更新。 如何使摘要每次都根据用户输入进行更新?

这是我的代码:

SettingActivity.java

public class SettingsActivity extends AppCompatActivity {


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

    // Display the fragment as the main content.
    getFragmentManager().beginTransaction()
            .replace(android.R.id.content, new SettingsFragment()).commit();

    setTitle("Settings");
    ActionBar actionBar=getSupportActionBar();
    // Show the Up button in the action bar.
    actionBar.setDisplayHomeAsUpEnabled(true);
}



public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

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

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

    }

    @Override
    public void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);

    }

    @Override
    public void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);

    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        Preference pref = findPreference(key);
        if (pref instanceof EditTextPreference) {
            EditTextPreference listPref = (EditTextPreference) pref;
            pref.setSummary(listPref.getText());
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home) {
            startActivity(new Intent(getActivity(), HomeActivity.class));
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
}

settings_layout.xml

 <EditTextPreference
        android:capitalize="words"
        android:dependency="email_switch"
        android:defaultValue="@string/default_email_address"
        android:key="example_text"
        android:summary="@string/pref_description_email"
        android:maxLines="1"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="@string/pref_email_address_text_title"
        android:inputType="textWebEmailAddress" />
 <EditTextPreference
        android:capitalize="words"
        android:dependency="sms_switch"
        android:defaultValue="@string/default_mobile_number"
        android:key="example_text1"
        android:summary="@string/pref_description_sms"
        android:maxLines="1"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="@string/pref_mobile_number_text_title"
        android:inputType="phone"/>

P.S。我在我的 MAIN Activity

中调用它
PreferenceManager.setDefaultValues(this, R.xml.settings_layout, false);

SettingsFragment class 的 onCreate() 方法中,您需要获取对 SharedPreferences 的引用,然后 运行 [=14] =] 方法。您的 onCreate() 应如下所示:

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

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

    //if you are using default SharedPreferences
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());

    onSharedPreferenceChanged(sharedPrefs, getString(R.string.key1));
    onSharedPreferenceChanged(sharedPrefs, getString(R.string.key2));

}

其中 key1key2 是您保存到 strings 文件中的首选项键(example_textexample_text1)。我在没有字符串引用的情况下自己执行此操作时遇到了问题,这就是我建议提取它们的原因。