限制EditText只能输入带符号的十进制数

3
我正在编写一个应用程序,需要向用户显示动态创建的 EditText 控件表格。
我的当前代码:
      /**
      * Create and display the table of EditTexts on the screen
      * @param x Number of columns
      * @param y Number of rows
      */
        private void createTable(int x, int y) {
            TableLayout table = (TableLayout) findViewById(R.id.TableLayout01);
            etGrid = new EditText[y][x];
            for (int i = 0; i < y; i++) {
                TableRow row = new TableRow(this);
                for (int j = 0; j < x; j++) {
                    EditText et = new EditText(this);

                    et.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL 
                              | InputType.TYPE_NUMBER_FLAG_SIGNED);

                    et.setSingleLine();
                    et.setMinimumWidth(getWindowManager().getDefaultDisplay().getWidth()/x);
                    etGrid[i][j] = et;
                    row.addView(et);
                }
                table.addView(row,new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
            }

        }

问题在于这一行,根本不起作用:
et.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL 
                                  | InputType.TYPE_NUMBER_FLAG_SIGNED);

在我的Kindle Fire上,我可以使用InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL限制为十进制值,也可以使用InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED限制为带符号的值,但不能同时限制为带符号的十进制值。这段代码有什么问题?

2
我并没有看到你的代码有什么问题。你可以尝试使用.setRawInputType();,但如果这也不起作用,那很可能是亚马逊在Kindle上搞砸了什么。 - Stefan de Bruijn
3个回答

11

试一试:

et.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_NUMBER_FLAG_DECIMAL);

参考资料: setRawInputType

编辑:

我尝试了这个方法并且成功了。

请确保:

你需要从xml布局文件中的 et edittext中删除属性android:inputType。否则,将不会反映setRawInputType的更改。

谢谢。


这通常是有效的,但减号和点号会作为未知字符插入到EditText中。 - bvk256
@bvk256 请查看我发布的带有解决方案的编辑。这对我完美地起作用。 - Pratik Sharma
XML布局文件中没有任何EditText的定义,因为它们全部都是在运行时动态创建的。 - bvk256

11

在其他选项之前始终添加InputType.TYPE_CLASS_NUMBER非常重要:InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_NUMBER_FLAG_DECIMAL,否则键盘不会是数字!


1
这是一个常规的OR操作。顺序完全不重要。A + B与B + A相同。 - Captain Giraffe

0

这确实是亚马逊安卓系统中的一个错误。由于我正在为自己编写应用程序,因此有一个小技巧完全适合我:

  1. 设置 InputType.TYPE_CLASS_PHONE
  2. 实现自定义键过滤器以强制执行正确的格式。我使用了这个

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