【问题标题】:How do I use InputType=numberDecimal with the "phone" soft keypad?如何将 InputType=numberDecimal 与“电话”软键盘一起使用?
【发布时间】:2011-02-19 07:33:14
【问题描述】:

对于EditText 框,用户应该只输入有效数字,所以我使用android:inputType="numberDecimal"。不幸的是,Android 提供的软键盘只有顶行有数字,而接下来的三行有各种其他符号(美元符号、百分号、感叹号、空格等)。由于numberDecimal 只接受数字 0-9、负号和小数点,因此使用“电话”软键盘(0-9 在 3x3 网格中,加上一些其他符号)会更有意义。这将使按钮更大,更容易点击(因为它是 4x4 网格,而不是同一屏幕区域中的 10x4 网格)。不幸的是,使用android:inputType="phone" 允许使用括号等非数字字符

我尝试使用android:inputType="numberDecimal|phone",但位标志的numberDecimal 方面似乎被忽略了。我也尝试过将android:inputType="phone"android:digits="0123456789-." 结合使用,但这仍然允许使用多个负号或小数点(inputType="number" 对此类事情的错误检查非常好,甚至不会让用户输入)。我也尝试在 xml 布局文件中使用android:inputType="phone",同时在 java 代码中使用DigitsKeyListener,但随后只使用默认数字软键盘(仅在顶行有数字的那个)(它似乎设置InputType.TYPE_CLASS_NUMBER,这会使xml布局设置的InputType.TYPE_CLASS_PHONE无效)。

编写自定义 IME 是行不通的,因为用户必须选择 IME 作为应用程序外部的全局选项。

有什么方法可以使用“电话”式软键盘,同时对输入的内容使用“数字”限制?

【问题讨论】:

  • 在 Android 4 上,InputType.TYPE_CLASS_NUMBER 提供了一个不错的 4x4 键盘,并且比 InputType.Type_CLASS_PHONE 略好于普通数字。不幸的是,他们在旧版本上搞砸了,迫使我们开发人员自己破解它。
  • 我需要为编辑框支持数字和小数点。我尝试了以下方法,它似乎显示带有数字和句点的数字键盘。 amountField.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);

标签: android numeric-keypad


【解决方案1】:

我遇到了同样的问题。这对我有用:

<item name="android:inputType">numberDecimal</item>
<item name="android:digits">0123456789.</item>

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    到目前为止,我决定做的是扩展 DigitsKeyListener 并覆盖 getInputType() 以便它返回 InputType.TYPE_CLASS_PHONE。这允许我在 DigitsKeyListener 中使用方便的 filter(),但同时使用 TYPE_CLASS_PHONE 软键盘。我是 Android 编程的新手,但这似乎可以在不破坏任何东西的情况下工作。代码是这样的:

    import android.text.method.DigitsKeyListener;
    import android.text.InputType;
    public class CustomDigitsKeyListener extends DigitsKeyListener
    {
        public CustomDigitsKeyListener() {
            super(false, false);
        }
    
        public CustomDigitsKeyListener(boolean sign, boolean decimal) {
            super(sign, decimal);
        }
    
        public int getInputType() {
            return InputType.TYPE_CLASS_PHONE;
        }
    }
    

    这样做有什么问题吗(将 getInputType() 的返回切换到超类不打算的东西)?

    【讨论】:

      【解决方案3】:

      Adam Dunn 代码完美运行,但没有展示如何实现该类

      import android.text.method.DigitsKeyListener;
      import android.text.InputType;
      public class CustomDigitsKeyListener extends DigitsKeyListener
      {
          public CustomDigitsKeyListener() {
              super(false, false);
          }
      
          public CustomDigitsKeyListener(boolean sign, boolean decimal) {
              super(sign, decimal);
          }
      
          public int getInputType() {
              return InputType.TYPE_CLASS_PHONE;
          }
      }
      

      那么你必须像这样实例化

      MyTextView.setKeyListener(new CustomDigitsKeyListener(true,true));
      

      【讨论】:

        【解决方案4】:
        android:inputType="phone"
        android:digits="0123456789."
        

        将此添加到您的 EditText xml 布局中。
        这将显示电话布局,但只允许用户点击指定的数字。
        用户点击其他字符将被忽略。

        【讨论】:

          【解决方案5】:

          尝试在您的 EditText 视图中使用android:numeric="integer"

          【讨论】:

          • android:numeric 已被弃用。无论如何我都试过了,它仍然提供更完整的键盘,带有美元符号、百分号、感叹号、空格等。
          【解决方案6】:

          您只需使用手机键盘并自行检查输入。测试输入是否为 0 到 9 之间的有效数字并不是一个很大的条件。

          【讨论】:

          • 我希望进行就地检查,这样用户就无法输入错误的数字。这比检查最后的条目然后弹出一个警告号码不正确。在用户输入时提供尽可能早的反馈(例如,不允许输入第二个小数点)将使应用更加用户友好。
          • 是的,当应用程序是编写数据库的人时,我做到了一切正常,我的问题是将我用 java 编写的数据库附加到 android 数据库。我这样做的原因是每次应用程序出现时它都会构建巨大的文件(最大 8 MB 可以 b'这是 sqlight db 的限制大小)文件并且它在模拟器上花费了 7 秒的时间在真实的手机上这需要更多
          猜你喜欢
          • 1970-01-01
          • 2012-02-26
          • 2011-07-25
          • 2011-07-31
          • 2016-02-11
          • 2012-03-31
          • 1970-01-01
          • 2015-03-07
          • 1970-01-01
          相关资源
          最近更新 更多