Android-从EditTextPreference获取文本并进行验证

Android-从EditTextPreference获取文本并进行验证,android,edittextpreference,Android,Edittextpreference,我正在实现一个用户输入并保存PIN码的首选项。我使用的是EditTextPreference,PIN码应该正好是4位数字。为了验证它,我使用了以下方法 final EditTextPreference pinRetrieve = (EditTextPreference)getPreferenceScreen().findPreference("create_pin"); pinRetrieve.setOnPreferenceChangeListener(new Preference.OnPre

我正在实现一个用户输入并保存PIN码的首选项。我使用的是
EditTextPreference
,PIN码应该正好是4位数字。为了验证它,我使用了以下方法

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;
            }
        });
final EditTextPreference pinRetrieve=(EditTextPreference)getPreferenceScreen().findPreference(“create_pin”);
pinRetrieve.setOnPreferenceChangeListener(新的Preference.OnPreferenceChangeListener(){
@凌驾
公共布尔onPreferenceChange(首选项,对象o){
布尔值rtnval=true;
if(TextUtils.isEmpty(pinRetrieve.getText()){
final AlertDialog.Builder=新建AlertDialog.Builder(getActivity());
builder.setTitle(R.string.pin\u错误\u标题);
builder.setMessage(R.string.pin\u警报\u pin\u未设置);
setPositiveButton(android.R.string.ok,null);
builder.show();
pinSetting.setChecked(假);
rtnval=false;
}else if(pinRetrieve.getText().length()<4){
final AlertDialog.Builder=新建AlertDialog.Builder(getActivity());
builder.setTitle(R.string.pin\u错误\u标题);
builder.setMessage(R.string.pin\u警报\u pin\u小于\u数字);
setPositiveButton(android.R.string.ok,null);
builder.show();
pinSetting.setChecked(假);
rtnval=false;
}
返回rtnval;
}
});
即使当我输入4位数字时,我也会收到带有
R.string.pin\u alert\u pin\u not\u set
作为消息的警报框,我认为发生的事情是它总是转到
if(TextUtils.isEmpty(pinRetrieve.getText())
,即使它不是空的

我不能在
EditBoxPreference
上使用
TextUtils.isEmpty(pinRetrieve.getText())
?如果可以,为什么即使
pinRetrieve.getText()
不是空的,它也总是返回true


谢谢

TextUtils类的isEmpty函数接受一个字符序列作为参数,EditTextPreferences的getText返回一个字符串

宁可尝试

(TextUtils.isEmpty(new CharSequence(pinRetrieve.getText())))
String实现CharSequence接口

您可以尝试使用string类的subsequence函数,它将返回charsequence

String pin = pinRetrievce.getText();
CharSequnce pinSequence = pin.subSequence(0, pin.length());
(TextUtils.isEmpty(pinSequence)

传递给
onPreferenceChange(Preference Preference,Object o)
的第二个参数是首选项的新值,您可以检查它,而不是使用
EditTextPreference
引用。您还可以删除
final
关键字。并摆脱这些警告。您只需将
o
值转换为字符串。如果您的首选项是从xml文件添加的,则可以添加一个
android:maxLength=“4”
属性-这将不允许用户在EditText中键入超过4个字符。

为什么您的editextpreference应该是final?尝试删除final。然后AndroidStudio说我不能在内部类
onPreferenceChange()
中使用
EditBoxPreference
,谢谢。但是它说,
charSequence是抽象的,不能被实例化:(您可以使用字符串pinSequence=pin.subSequence(0,pin.length()).toString();谢谢:)
if(TextUtils.isEmpty(o.toString())
终于开始工作了。