【问题标题】:how to set only numeric value for EditTextPreference in android?如何在 android 中仅设置 EditTextPreference 的数值?
【发布时间】:2020-04-26 03:52:23
【问题描述】:

如何在 android 中只为 EditTextPreference 设置数值。 我希望用户输入端口号,但不确定如何将限制放在那里

我正在使用此代码,用户可以输入任何字符串。希望将用户限制为至少数字

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

【问题讨论】:

标签: android


【解决方案1】:

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

android:inputType="number"

或更具体地使用:

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

因为您只想将输入限制为端口号。

【讨论】:

  • 谢谢,EditTextPreference 不是 EditText 的后代,所以我想知道在 android 文档中哪里提到了这个?为什么有时事情在没有任何文档的情况下在 android 中神奇地工作?你能分享一个参考吗?谢谢
  • “为什么有时在没有任何文档的情况下,事情在 android 中可以神奇地工作?”是的,这个记录很差提示here。 “See EditText Attributes”这一行是唯一的提示......无论如何,您可能需要 "numberDecimal" 或考虑使用带有 android:digits="0123456789.:" 的 digits 属性来仅使用数字、句点和冒号。
  • 这似乎不适用于 appcompat 25,显示常规键盘
  • 我无法让它工作。没有什么能阻止输入从字面上看是任何东西,并保存为字面上的任何东西:(
  • 甚至在 androidx.preference.PreferenceFragmentCompat 中都不起作用。对此issue 加注星标 - 但不要活在希望中。要么根据其他答案重写曾经工作过的代码,要么使用最近为实现“androidx.preference:preference:1.1.0”更新的well-respected fix
【解决方案2】:

我使用 androidX 库,因为该库可以自定义 EditTextPreference 对话框的输入类型。 AndroidX 是对原始 Android 支持库的重大改进,因此建议大家使用这个库。 你可以阅读更多关于AndroidX的信息here.

这是我在 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后,将弹出对话框,您的键盘输入类型将仅为数字。

【讨论】:

  • 有点恼火,你不能让它只使用 XML
  • @JacobSchneider 是的,只是让我想保持原样。
  • 它有效,但我不得不删除 @NonNull 注释。它还显示不输入任何内容的特殊字符,例如 %&/*。提示:如果您删除“InputType.TYPE_NUMBER_FLAG_SIGNED”部分,它不会让您输入减号,这是我需要的。
【解决方案3】:

使用androidx.preference库,由于androidx.preference:preference:1.1.0-alpha02是2018年12月17日发布的,library增加了EditTextPreference.OnBindEditTextListener接口,可以自定义对话框绑定后在对应对话框中显示的EditText。

所以在这种情况下,您所要做的就是在下面添加 Kotlin 代码。

val editTextPreference = preferenceManager.findPreference<EditTextPreference>("YOUR_PREFERENCE_KEY")
editTextPreference.setOnBindEditTextListener { editText ->
                editText.inputType = InputType.TYPE_CLASS_NUMBER
}

【讨论】:

  • 很遗憾,此回调不适用于 Android-TV 的 LeanbackEditTextPreferenceDialogFragmentCompat。可以在此处找到解决方法:stackoverflow.com/a/56225993/2806862
  • @ItayBianco 是的,你是对的。这个特定的接口还没有在Leanback-Preference 包中实现。我提到的方法据我所知只有EditTextPreference可用。
【解决方案4】:

带十进制数输入的EditTextPreference (Kotlin):

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

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

    }

【讨论】:

  • 按照Sam's accepted 2012 answer设置属性不是更容易吗?
  • 嗯,这个有效,“山姆接受 2012 年的答案”不行。
【解决方案5】:

对我有用的 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
         }
     }

【讨论】:

    【解决方案6】:

    使用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 的访问权限,但是有一个 fix library 可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多