Android中的偏好设置活动中的数字偏好设置

43

我想做的是开发一个生命游戏程序。我想将时间延迟变成一个用户可以设置的偏好选项,并且让用户可以输入特定的时间。输入的数字可以是以毫秒或秒计算。

然而,我不知道如何进一步操作。我没有找到一个能够简单处理这个问题的选择项,但也许有这样一个选项。有没有一种简单的方法来创建这个选项,并确认输入的数据是整数或浮点数?

5个回答

89
使用EditTextPreference,并将输入类型设置为TYPE_CLASS_NUMBER。这将强制用户输入数字而不是文字。
EditTextPreference pref = (EditTextPreference)findPreference("preference_name");
pref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);

10
这个有效,应该是回答这个问题的答案。虽然点、逗号和其他值会显示给用户,但用户无法插入它们。所以你所接收到的输入只有数字。 - Indrek Kõue
33
当使用XML时,您也可以使用“android:inputType =”number“”。 - tslocum
4
请注意,使用AndroidX库时这不再适用:getEditText()不再可用,XML属性也不起作用,请参见:https://issuetracker.google.com/issues/37060038。但是,可以像其他答案提到的那样使用setOnBindEditTextListener来更改EditText上的设置。 - user905686

39
您可以使用xml属性android:numeric来强制执行它。 该属性的可能相关值为decimalinteger

1
EditTextPreference 没有 numeric 参数。 - Indrek Kõue
8
可以的。EditTextPreference 支持 EditText 的所有属性,并且我在我的项目中使用了这个属性。 - HRJ
3
这是有效的。https://dev59.com/NGYr5IYBdhLWcg3wvsvR#13425382有一个关于为什么这有效以及文档在哪里的略微更详细的评论。(简单来说,文档几乎没有。) - Jon Adams

32

你也可以直接在 preferences.xml 文件中进行此操作。类似这样的内容就可以:

<EditTextPreference
    android:defaultValue="100"
    android:dialogTitle="@string/pref_query_limit"
    android:inputType="number"
    android:key="pref_query_limit"
    android:summary="@string/pref_query_limit_summ"
    android:title="@string/pref_query_limit" />

4
如果我这样做,仍然会显示完整的键盘,允许我输入字母、符号等,这可能会破坏设置。 - Elliptica

17

如果您正在使用PreferenceActivity(很可能是),那么就没有可用的选项卡。您需要像这样做:

    /**
 * Checks that a preference is a valid numerical value
 */
Preference.OnPreferenceChangeListener numberCheckListener = new OnPreferenceChangeListener() {

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        //Check that the string is an integer.
        return numberCheck(newValue);
    }
};

private boolean numberCheck(Object newValue) {
    if( !newValue.toString().equals("")  &&  newValue.toString().matches("\\d*") ) {
        return true;
    }
    else {
        Toast.makeText(ActivityUserPreferences.this, newValue+" "+getResources().getString(R.string.is_an_invalid_number), Toast.LENGTH_SHORT).show();
        return false;
    }
}


    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //get XML preferences
    addPreferencesFromResource(R.xml.user_preferences);


    //get a handle on preferences that require validation
    delayPreference = getPreferenceScreen().findPreference("pref_delay");

    //Validate numbers only
    delayPreference.setOnPreferenceChangeListener(numberCheckListener);

}

唯一的问题是在示例中未定义delayPreference(我知道它是一个Preference)。此外,这是首选项活动类内部的代码,但似乎运行良好,非常感谢。 - Kinglink

4
在Android Jetpack Preference中,访问EditText的方式已经改变,现在需要像这样访问:
val preference = findPreference<EditTextPreference>(getString(R.string.pref_numdefault_key))
preference?.setOnBindEditTextListener {
    it.inputType = InputType.TYPE_CLASS_NUMBER
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接