5

我有一个数字,EditTextPreference其中必须是数字 0-9。我可以阻止其他字符但不能退格。Backspace + Okay = 一个空值。空值意味着当它被检索并解析为一个数字时,它将崩溃。

目前,我检查首选项何时更改,是否具有某些键且没有长度,如果是,则使用“0”重新保存。有没有更简单的内置方法来做到这一点?“需要值”属性,或者至少是更自动的东西,比如能够获得digits更改后的偏好?(如果数字是“0123456789”,那么它不能为空)。

到目前为止,在我的设置活动中:

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    //Prevent EditText from being non number
    String type = this.findPreference(key).getClass().getSimpleName();
    if( type.equals("EditTextPreference")
        //Put key of any allowed to be blank here...
                && prefs.getString(key, "0").length()==0 ){ 
            this.findPreference(key).setSummary("0");

        SharedPreferences.Editor prefedit = prefs.edit();
        prefedit.putString(key, "0");
        prefedit.commit();
    }
    updateSummaries();
}

(设置摘要不起作用--^。能够检查android:digits="0123456789"属性就可以了,所以我不需要放置任何应该为空白的键。)

或者在主要活动中,我可以将所有数字首选项放入字符串中,检查字符串,如果不好则将其设置为 0,然后解析每个字符串。随着我使用它们中的更多,这感觉不那么吸引人,而不是自动的。

String sTT = prefs.getString("mykey", "0");
>> x10
if(sTT.length()==0){ sTT="0"; }
>> x10
tt = Long.parseLong( sTT );
>> x10, different types

(这可能仍然是最好的方法......?)

4

4 回答 4

1

您可以将 aTextWatcher应用于EditTextPreference的底层EditText。这允许您拦截对文本的任何更改,并以您想要的任何方式对其进行修改,例如强制它包含默认数字 ( 0)。

虽然,我认为在解析数据时处理空输入总体上更有意义。

于 2012-11-21T15:11:05.227 回答
0

你总是可以制作一个简单的首选项类,它需要一个 EditTextandroid:inputType = "number"

于 2012-11-21T15:11:11.170 回答
0

真的很老,但以防万一有人对此有问题,这是我通常在这种情况下所做的,

让你的应用程序类实现 OnSharedPreferenceChangeListener,它看起来像这样:

public class MyAppApplication extends Application implements
        OnSharedPreferenceChangeListener

把这个放在oncreate中,这样你就可以随时主动关注Menu更新;

preference = PreferenceManager.getDefaultSharedPreferences(this);
        preference.registerOnSharedPreferenceChangeListener(this);

你可以在你的应用程序类的任何合适的部分做到这一点,

if (preference.getString("prefkey", "").compareTo("") == 0) {
            SharedPreferences.Editor temp = preference.edit();
            temp.putString("prefkey", defaultServerAddress);
            temp.apply();
        }

我在我的OnCreatetho 中这样做,所以每当应用程序启动时,有问题的首选项总是被还原。

您还可以进行智能移动public void onSharedPreferenceChanged,以跟踪首选项变为空白的可能性。

于 2015-11-13T01:08:32.427 回答
0

一个非常简单的方法是像这样简单地覆盖 EditTextPreference。

public class SafeEditTextPreference extends EditTextPreference {

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public SafeEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public SafeEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

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


    @Override
    protected void onDialogClosed(boolean positiveResult) {
        boolean valid = this.getEditText().getText().toString().length() > 0;
        super.onDialogClosed(valid);
    }

}

然后使用它而不是 EditTextPreference。如果文本字符串至少为 1 长,它只会保存到首选项,但是您可以将该有效性检查更改为您需要的任何内容。

您可以添加一个 TextWatcher 来为用户提供更动态的响应。

于 2016-10-15T10:45:48.727 回答