>我正在实现一个首选项,用户在其中输入并保存PIN码。我为此使用EditTextPreference
,PIN码应正好为4位数字。为了验证它,我使用了以下OnPreferenceChangeListener()
方法
final EditTextPreference pinRetrieve = (EditTextPreference)getPreferenceScreen().findPreference("create_pin");
pinRetrieve.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
Boolean rtnval = true;
if (TextUtils.isEmpty(pinRetrieve.getText())){
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.pin_error_heading);
builder.setMessage(R.string.pin_alert_pin_not_set);
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
pinSetting.setChecked(false);
rtnval = false;
} else if (pinRetrieve.getText().length() < 4){
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.pin_error_heading);
builder.setMessage(R.string.pin_alert_pin_less_digits);
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
pinSetting.setChecked(false);
rtnval = false;
}
return rtnval;
}
});
即使我输入 4 位数字,我也会收到带有 R.string.pin_alert_pin_not_set
作为消息的警报框,我认为发生的事情是它总是转到 if (TextUtils.isEmpty(pinRetrieve.getText()))
,即使它不为空。
我不能在EditBoxPreference
上使用TextUtils.isEmpty(pinRetrieve.getText())
吗?如果可以,为什么即使pinRetrieve.getText()
不为空,它也总是返回 true?
谢谢
onPreferenceChange(Preference preference, Object o)
的第二个参数是首选项的新值,您可以检查它,而不是使用EditTextPreference
引用。您还可以删除final
关键字。并摆脱警告。您所需要的只是将o
值强制转换为字符串。如果您的首选项是从 xml 文件添加的,则可以添加 android:maxLength="4"
属性 - 这将不允许用户在 EditText 中键入超过 4 个字符。
TextUtils 类的 isEmpty 函数接受 char 序列作为参数,EditTextPreferences 的 getText 返回一个字符串。
而是尝试
(TextUtils.isEmpty(new CharSequence(pinRetrieve.getText())))
字符串实现 CharSequence 接口。
您可以尝试使用字符串类的子序列函数,它将返回一个字符序列。
String pin = pinRetrievce.getText();
CharSequnce pinSequence = pin.subSequence(0, pin.length());
(TextUtils.isEmpty(pinSequence)