Android - 尝试清理首选项上的用户输入

时间:2013-07-09 18:39:22

标签: android sanitization preference

我正在尝试清理我的应用程序上将被发送到服务器端的一些用户输入。根据服务器设置,可以在创建或访问文件和文件夹时使用用户输入的数据。显然,卫生也将在服务器上处理,但我不会,由于应用程序的性质,应用程序将无法控制这一点。因此,我认为在我或我的应用程序可以控制的情况下进行端到端的卫生设施是我的责任。

我正在尝试清理的首选项是将相册名称传递给服务器。

根据Log.d输出,这是正常的。但是,当我单击首选项字段进行编辑时,它会显示未过滤的输入,并且当首选项传递给服务器时,它还会显示未过滤的输入。

FileUtil.sanitize(stringValue)是一个简单的方法,用于修剪前导和尾随空格,并从字符串中删除../..\,现在至少。我知道还有其他一些我需要关注的东西,而不是100%的东西。

所以,显而易见的问题是,我错过了什么?是否有一个事件在完成后触发,会覆盖我在这里所做的更改?我觉得有些东西会覆盖我的更改,因为当我在更改后立即获得值时,它会显示正确的,已清理的数据。

    /**
     * A preference value change listener that updates the preference's summary
     * to reflect its new value.
     */
    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
        String stringValue = value.toString();

        if (preference instanceof ListPreference) {
            // For list preferences, look up the correct display value in
            // the preference's 'entries' list.
            ListPreference listPreference = (ListPreference) preference;
            int index = listPreference.findIndexOfValue(stringValue);

            // Set the summary to reflect the new value.
            preference.setSummary(
                index >= 0
                    ? listPreference.getEntries()[index]
                    : null);

        } else if (preference.getKey().equals("text_default_album")) {
            Log.d(TAG, "default pref: "+preference.getKey()+" value: "+stringValue);
            stringValue = FileUtil.sanitize(stringValue);
            Log.d(TAG, "default pref: "+preference.getKey()+" value: "+stringValue);
            preference.setSummary(stringValue);

            SharedPreferences prefs = preference.getSharedPreferences();
            String def = prefs.getString("text_default_album", "");
            Boolean updated = prefs.edit().putString("text_default_album", stringValue).commit();
            String def2 = prefs.getString("text_default_album", "");
            Log.d(TAG, "def: "+def);
            Log.d(TAG, "def2: "+def2);
            Log.d(TAG, "updated: "+updated);
        } else {
            // For all other preferences, set the summary to the value's
            // simple string representation.
            preference.setSummary(stringValue);
        }
        return true;
        }
    };

1 个答案:

答案 0 :(得分:0)

我通过扩展EditTextPrefence课程并覆盖setTextgetText

解决了我的问题

这是基于我找到的答案here

package com.example.overrides;

import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;

public class SanitizedEditTextPreference extends EditTextPreference {
    public SanitizedEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SanitizedEditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SanitizedEditTextPreference(Context context) {
        super(context);
    }

    @Override
    public String getText() {
        String value = super.getText();
        return StringUtil.sanitize(value);
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        super.setText(restoreValue ? getPersistedString(null) : (String) defaultValue);
    }

    @Override
    public void setText(String text) {
        if (StringUtil.isStringBlank(text)) {
            super.setText(null);
            return;
        }
        super.setText(StringUtil.sanitize(text));
    }
}

我将以前的代码简化为:

/**
 * A preference value change listener that updates the preference's summary
 * to reflect its new value.
 */
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
    String stringValue = value.toString();

    if (preference instanceof ListPreference) {
        // For list preferences, look up the correct display value in
        // the preference's 'entries' list.
        ListPreference listPreference = (ListPreference) preference;
        int index = listPreference.findIndexOfValue(stringValue);

        // Set the summary to reflect the new value.
        preference.setSummary(
            index >= 0
                ? listPreference.getEntries()[index]
                : null);

    } else if (preference.getKey().equals("text_default_album")) {
        stringValue = StringUtil.sanitize(stringValue);
        preference.setSummary(stringValue);
    } else {
        // For all other preferences, set the summary to the value's
        // simple string representation.
        preference.setSummary(stringValue);
    }
    return true;
    }
};

并在pref.xml文件中使用它:

<com.example.overrides.SanitizedEditTextPreference
            android:key="text_default_album"
            android:title="@string/pref_title_default_album"
            android:defaultValue="@string/pref_default_album"
            android:selectAllOnFocus="true"
            android:inputType="text"
            android:capitalize="none"
            android:singleLine="true"
            android:maxLines="1" />