8

SharedPreferencesAndroidの に大きな問題があります。アプリケーションを閉じると、環境設定により、文字列値の 1 つに不要な文字が追加されます。実際には、構成可能なエスケープ シーケンスです。

私は簡単なセットアップを持っています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スタジオを介してアプリを再起動すると、コード内の同じブレークポイントが突然表示されます: Java.lang.String, value(char[6])= "\n\n ", count=6、4つのスペースと10のエスケープ\u0000文字が含まれています。

なぜこれが起こっているのか、それについて私にできることはありますか?

ところで、これまでのところ、アプリのどこでも SharedPreferences.Editor に触れていません。私はPreferencesScreenを介して厳密に行われます。したがって、アプリ内のどこでも上書きは行われません。デフォルト値も適用されるべきではありませんが、設定はandroid:defaultValue="\n\n"とにかく適用されます。

編集:

私は理由を見つけました:改行が設定の最後にある場合、アンドロイドはスペースを追加します。理由がわかりません。

編集:

カスタム設定コードは次のとおりです。

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

SharedPreferencesこれは Android API 18 以降のバグで、文字列が で終わるときに余分な空白が挿入されると思います\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 に答える