Android中的首选项活动中的数字首选项

Kin*_*ink 40 android preferenceactivity android-preferences

我想做的是我正在制作一个生命游戏计划.我想花时间延迟并优先考虑,但我想让人们可以在特定时间输入.数字可以是几毫秒或几秒.

然而,我有点坚持如何继续,我还没有找到一个已经处理过的简单偏好,但可能有一个.是否有一种简单的方法来确定此偏好并确认输入的数据是整数还是漂浮?

Kev*_*ood 86

使用EditTextPreference并将输入类型设置为TYPE_CLASS_NUMBER.这将强制用户输入数字而不是字母.

EditTextPreference pref = (EditTextPreference)findPreference("preference_name");
pref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
Run Code Online (Sandbox Code Playgroud)

  • 使用XML时,您还可以使用`android:inputType ="number"`. (31认同)
  • 这个有用,应该回答这个问题.虽然向用户显示点,彗差和其他值,但用户**不能**插入它们.因此,只有您从此处收到的输入才是数字. (9认同)
  • 请注意,这对于 AndroidX 库不再适用:“getEditText()”不再可用,XML 属性也不起作用:https://issuetracker.google.com/issues/37060038。但是,正如另一答案提到的,人们仍然可以使用“setOnBindEditTextListener”更改 EditText 上的设置。 (4认同)

HRJ*_*HRJ 38

您还可以使用xml属性强制执行它android:numeric.此属性的可能相关值为decimalinteger.

  • @SYLARRR确实如此.`EditTextPreference`支持`EditText`的所有属性.我在我的项目中使用此属性. (8认同)
  • 这确实有效.http://stackoverflow.com/a/13425382/2291对于其工作原理及其记录位置有一个更具描述性的评论.(TL; DR几乎没有记录.) (3认同)
  • 这给我带来了很多麻烦 - 非常感谢 (2认同)

Jes*_*run 29

您也可以直接在您的网站上执行此操作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" />
Run Code Online (Sandbox Code Playgroud)

  • 如果我这样做,它仍会显示一个完整的键盘,并允许我输入字母,符号等,它们会破坏设置 (2认同)

jax*_*jax 17

如果您使用的是PreferenceActivity,那么就没有可用的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);

}
Run Code Online (Sandbox Code Playgroud)