我想做的是我正在开发一个生命游戏程序。我想延迟时间并使其成为首选,但我想让人们可以输入特定的时间。该数字可以以毫秒或秒为单位。
但是,我对如何进行有点困惑,我无法找到一个已经处理这个问题的简单偏好,但可能有一个。有没有一种简单的方法可以做出这种偏好并确认输入的数据是整数还是浮点数?
我想做的是我正在开发一个生命游戏程序。我想延迟时间并使其成为首选,但我想让人们可以输入特定的时间。该数字可以以毫秒或秒为单位。
但是,我对如何进行有点困惑,我无法找到一个已经处理这个问题的简单偏好,但可能有一个。有没有一种简单的方法可以做出这种偏好并确认输入的数据是整数还是浮点数?
使用 EditTextPreference 并将输入类型设置为 TYPE_CLASS_NUMBER。这将强制用户输入数字而不是字母。
EditTextPreference pref = (EditTextPreference)findPreference("preference_name");
pref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
您也可以使用 xml 属性强制执行它android:numeric
。此属性的可能相关值为decimal
和integer
。
您也可以直接在您的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" />
如果您正在使用您可能使用的 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);
}
在 Android Jetpack Preference 中,事情发生了变化,要访问 EditText,您必须像这样访问
val preference = findPreference<EditTextPreference>(getString(R.string.pref_numdefault_key))
preference?.setOnBindEditTextListener {
it.inputType = InputType.TYPE_CLASS_NUMBER
}