【问题标题】:How to update a preference summary in android如何在android中更新偏好摘要
【发布时间】:2017-01-05 09:42:23
【问题描述】:

在我的应用程序的设置页面中有两个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"/>

附:我在我的主要活动中调用它

PreferenceManager.setDefaultValues(this, R.xml.settings_layout, false);

【问题讨论】:

    标签: java android sharedpreferences android-preferences android-settings


    【解决方案1】:

    SettingsFragment 类的onCreate() 方法中,您需要获取对SharedPreferences 的引用,然后运行onSharedPreferenceChanged() 方法。你的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)。我自己在没有字符串引用的情况下执行此操作时遇到问题,这就是我建议提取它们的原因。

    【讨论】:

    • 甜蜜!此外,如果您最终添加了更多首选项,您只需为每个方法添加另一个方法,并使用键字符串。
    • 我当然会这样做:)
    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2012-02-06
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多