如何在Android中为EditTextPreference设置仅数字值?

55

如何在Android的EditTextPreference中设置仅数字值。我希望用户只输入端口号,但不确定如何设置该限制。

我使用了以下代码,用户可以输入任何字符串。想要限制用户至少只能输入数字。

   <EditTextPreference 
    android:defaultValue="4444" 
    android:key="port" 
    android:title="Port" 
    android:dependency="service_on"        
    />    

请参见以下AndroidX答案: https://dev59.com/qlgQ5IYBdhLWcg3wazMi#67747129 - TwiXter
7个回答

88

EditTextPreference部件应该具有与常规EditText相同的属性,因此请使用:

android:inputType="number"

或者更具体地说,使用:

android:inputType="numberDecimal"
android:digits="0123456789"

因为您希望将输入限制为仅端口号。


谢谢,EditTextPreference不是EditText的子类,所以我想知道在Android文档中是否有提到?为什么有时候在Android中的事情会神奇地工作而没有任何文档?你能分享一个参考吗?谢谢。 - Ahmed
19
有时在Android中为什么会出现没有文档可供参考的神奇操作呢?是的,这个可能是文档写得不够好,在这里可以找到提示:http://developer.android.com/reference/android/preference/EditTextPreference.html。其中的“查看EditText属性”是唯一的提示......无论如何,您可能想要使用"numberDecimal",或者考虑使用digits 属性,设置android:digits="0123456789.:" 只接受数字、句点和冒号。 - Sam
40
这似乎在使用appcompat 25时无法运行,会显示普通键盘。 - JohnC
请注意,该值仍以字符串形式存储在首选项中,因此在检索它时需要解析它(如果您想使用整数)。 - Geoff
4
我无法让它工作。没有任何阻止输入成为任何内容的限制,并且保存时可以是任何东西。 :( - Elliptica
4
甚至在 androidx.preference.PreferenceFragmentCompat 中都无法正常工作。对此,请为该 问题 点亮星星 - 但不要抱太大希望。您可以重写曾经有效的代码,如其他答案所述,或使用这个 备受尊重的修复方法,该方法最近针对 implementation "androidx.preference:preference:1.1.0" 进行了更新。 - Bad Loser

43

我使用AndroidX库,因为该库可以自定义EditTextPreference对话框的输入类型。AndroidX是原始Android支持库的重大改进,建议每个人都使用此库。您可以在此处了解更多关于AndroidX的信息。

这是我在onCreatePreference方法中使用EditTextPreference的代码:

 @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preference, rootKey);



androidx.preference.EditTextPreference editTextPreference = getPreferenceManager().findPreference("use_key_from_editTextPreference_in_xml_file");
editTextPreference.setOnBindEditTextListener(new androidx.preference.EditTextPreference.OnBindEditTextListener() {
            @Override
            public void onBindEditText(@NonNull EditText editText) {
                editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);

            }
        });

       }

使用此代码后,单击editTextPreference时,会弹出对话框并且您的键盘输入类型将仅为数字。


12
我有点烦恼,你不能仅通过XML使它正常工作。 - J-Cake
@JacobSchneider 是的,这让我想把它保留原样。 - lasec0203
1
它可以工作,但我不得不删除@NonNull注释。此外,它显示特殊字符,如%&/*,这些字符不会输入任何内容。提示:如果您删除“InputType.TYPE_NUMBER_FLAG_SIGNED”部分,它将不允许您输入减号,这正是我所需要的。 - Marcell

23
使用 androidx.preference 库,自从 2018.12.17 发布的 androidx.preference:preference:1.1.0-alpha02 版本后,library 添加了 EditTextPreference.OnBindEditTextListener 接口,允许您在对话框绑定后自定义相应对话框中显示的 EditText。
因此,在这种情况下,您只需添加以下 Kotlin 代码。
val editTextPreference = preferenceManager.findPreference<EditTextPreference>("YOUR_PREFERENCE_KEY")
editTextPreference.setOnBindEditTextListener { editText ->
                editText.inputType = InputType.TYPE_CLASS_NUMBER
}

2
很遗憾,此回调函数对于Android-TV的LeanbackEditTextPreferenceDialogFragmentCompat不起作用。可以在这里找到一种解决方法:https://dev59.com/qlgQ5IYBdhLWcg3wazMi#56225993 - Itay Bianco
@ItayBianco 是的,你说得对。这个特定的接口还没有在 Leanback-Preference 包中实现。据我所知,我提到的方法只在 EditTextPreference 中可用。 - Brainor

9

带小数输入的EditTextPreference (Kotlin):

var myEditTextPreference : EditTextPreference? = findPreference("myEditTextPreferenceKey")

    myEditTextPreference?.setOnBindEditTextListener { editText ->
        editText.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL

    }

按照Sam 2012年的回答,将属性设置为易于吗? - greybeard
这个可以用,但'Sam的2012年答案'不行。 - user13407337

4

我成功使用的 Kotlin 代码:

这里的“editTextPrefSleepTime”是 EditTextPreference 的键,我在 xml 文件中设置了它。

    private var editTextPrefSleepTime: EditTextPreference? = null

     override fun onStart() {
         super.onStart()
         editTextPrefSleepTime = preferenceManager.findPreference("editTextPrefSleepTime")
         editTextPrefSleepTime?.setOnBindEditTextListener {
             it.inputType = InputType.TYPE_CLASS_NUMBER
         }
     }

3

使用 getEditText 方法访问 EditTextPreference 的 EditText 方法,并设置 输入类型

EditTextPreference pref = (EditTextPreference) findPreference("pref_edit_text");
if (pref != null) {
    pref.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
}

不幸的是,官方库android.support.v7.preference隐藏了getEditText的访问权限,但是有一个修复库可以解决这个问题。


0

对我来说,我想要允许用户只输入数字和点,以便他们可以输入IP地址。

这是JAVA

  androidx.preference.EditTextPreference toesIpText = getPreferenceManager()
    .findPreference("toes_ip_address");
  assert toesIpText != null;
  toesIpText.setOnBindEditTextListener(editText -> {
    editText.setInputType(InputType.TYPE_CLASS_TEXT);
    editText.setKeyListener(DigitsKeyListener.getInstance("123456789."));
  });

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