我正在尝试清理我的应用程序上将被发送到服务器端的一些用户输入。根据服务器设置,可以在创建或访问文件和文件夹时使用用户输入的数据。显然,卫生也将在服务器上处理,但我不会,由于应用程序的性质,应用程序将无法控制这一点。因此,我认为在我或我的应用程序可以控制的情况下进行端到端的卫生设施是我的责任。
我正在尝试清理的首选项是将相册名称传递给服务器。
根据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;
}
};
答案 0 :(得分:0)
我通过扩展EditTextPrefence
课程并覆盖setText
和getText
这是基于我找到的答案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" />