8

SharedPreferences我在Android中有一个大问题。关闭应用程序后,首选项会将不需要的字符添加到我的字符串值之一。实际上它是一个可配置的转义序列。

我有一个简单的设置,一个MainActivity包含

@Override
protected void onStart() {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    sequence = prefs.getString("escape_sequence", "");
}

以及设置值的首选项屏幕。当我打开应用程序转到首选项屏幕时,将值正确设置为\n\n并返回到MainActivity断点正确显示序列为Java.lang.String, value(char[2])= "\n\n", count=2. 当我现在通过 android studio 重新启动应用程序时,代码中的相同断点突然显示:Java.lang.String, value(char[6])= "\n\n ", count=6,包含 4 个空格和 10 个转义\u0000字符。

任何人都可以为什么会发生这种情况以及我能做些什么吗?

顺便说一句,到目前为止,我没有在应用程序的任何地方触及 SharedPreferences.Editor。我是通过 PreferencesScreen 严格完成的。因此,在应用程序的任何地方都不会进行覆盖。也不应应用默认值,但android:defaultValue="\n\n"无论如何设置都是如此。

编辑:

我找到了原因:如果换行符位于首选项的末尾,android会添加空格。我不知道为什么。

编辑:

这是自定义首选项代码:

public class SequencePreference extends DialogPreference {
    EditText sequenceInput;

    public SequencePreference(Context context, AttributeSet attrs) {
        super(context, attrs);

        setDialogLayoutResource(R.layout.dialog_preference_sequence);
        setPositiveButtonText(R.string.settings_sequence_ok);
        setNegativeButtonText(R.string.settings_sequence_cancel);

        setDialogIcon(null);
    }

    @Override
    protected View onCreateDialogView() {
        View view = super.onCreateDialogView();
        sequenceInput= (EditText)view.findViewById(R.id.sequence_input);

        return view;
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        // When the user selects "OK", persist the new value
        if (positiveResult) {
            String sequenceValue = new String( sequenceInput.getText().toString() );

            String[] parts = sequenceValue.split("-");
            if(parts.length == 2) {
                persistString(parts[1]);
            }
        }
    }
}
4

2 回答 2

9

我认为这是 Android API 18 和更新版本中的一个错误,当SharedPreferences字符串以\n. 有关更多信息,请参阅:

https://code.google.com/p/android/issues/detail?id=159799#c6 https://code.google.com/p/android/issues/detail?id=159799#c7

于 2016-04-26T21:13:16.370 回答
1

检索保存的字符串后,放置一个 trim()。例子

String sequence2 = sequence.trim()
于 2018-09-12T17:56:24.757 回答