【问题标题】:Android InputType layout parameter - how to allow negative decimals?Android InputType 布局参数 - 如何允许负小数?
【发布时间】:2011-02-21 00:43:32
【问题描述】:

我有一个布局,其中包含三个用于输入三个地图坐标的字段。到目前为止,一切都很好。我在布局中使用 android:inputType="numberDecimal" 。输入字段时,用户会得到数字键盘。还好。

但是,当需要输入负坐标时,没有明显的方法可以做到这一点。

23.2342 工作正常。 232.3421 工作正常。 -11.23423 无法输入 - 无法输入前导负号,甚至无法将坐标包含在 () 中。

我确定我可以将其更改为纯文本 inputType,然后使用正则表达式来验证输入的内容实际上是数字坐标,处理返回给用户的错误消息等。但是我宁愿不走那条路。

我已经用 Google 搜索并在 Stackoverflow 上搜索了几个小时,但没有运气。有什么建议吗?

【问题讨论】:

  • 我也遇到了同样的问题,但是凯文的回答解决了我的问题。我只需要能够拥有只有数字的 EditText 并且能够拥有负数。谢谢! android:inputType="numberDecimal|numberSigned"
  • here 发布的答案是您正在寻找解决问题的最简单的解决方案,所以看看 ;)

标签: android layout


【解决方案1】:

除非我错过了什么,否则这就是你所需要的

android:inputType="numberDecimal|numberSigned"

【讨论】:

  • 不确定这是否过时,但 Mono 不再接受底部输入。顶部应该适用于两者
  • 我删除了底部输入。
【解决方案2】:

请使用此代码

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

【讨论】:

    【解决方案3】:

    您必须在布局的 EditText 标记中添加 numberSigned (*.xml)

     <EditText android:inputType="numberDecimal|numberSigned"></EditText>
    

    祝你好运!

    【讨论】:

      【解决方案4】:

      EditText.setInputType 中设置 InputType.TYPE_NUMBER_FLAG_SIGNED

      【讨论】:

      • 使用 .xml 布局,并且这个 (android:inputType="TYPE_NUMBER_FLAG_SIGNED" 给出错误:错误:不允许字符串类型(在 'inputType' 的值为 'TYPE_NUMBER_FLAG_SIGNED')。
      【解决方案5】:

      我认为创建您自己的自定义 keylistener 可能是您最好的选择。我做了类似的事情。我像这样创建了一个 SignedDecimalKeyListener:

      public class SignedDecimalKeyListener extends NumberKeyListener 
      {
          private char[] mAccepted;
          private static SignedDecimalKeyListener sInstance;
      
          private static final char[] CHARACTERS = new char[] { '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' };
      
          @Override
          protected char[] getAcceptedChars()
          {
              return mAccepted;
          }
      
          private SignedDecimalKeyListener()
          {
              mAccepted = CHARACTERS;
          }
      
          public static SignedDecimalKeyListener getInstance()
          {
              if(sInstance != null) 
                  return sInstance;
              sInstance = new SignedDecimalKeyListener();
              return sInstance;
          }
      
          public int getInputType()
          {
              return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
          }
      
          @Override
          public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)
          {
              CharSequence out = super.filter(source, start, end, dest, dstart, dend);
      
              if(out != null)
              {
                  source = out;
                  start = 0;
                  end = out.length();
              }
      
              //Only allow a '-' to be the very first char
              //and don't allow '.' to be the first char
              if(dstart > 0 && source.equals("-") || dstart == 0 && source.equals("."))
              {
                  SpannableStringBuilder stripped = null;
      
                  stripped = new SpannableStringBuilder(source, start, end);
                  stripped.delete(start, end);
      
                  if(stripped != null)
                      return stripped;
              }
              else if(source.equals("."))
              {
                  for(int lo = dend-1; lo > 0; lo--)
                  {
                      char c = dest.charAt(lo);
                      if(source.equals(String.valueOf(c)))
                      {
                          SpannableStringBuilder stripped = null;
      
                          stripped = new SpannableStringBuilder(source, start, end);
                          stripped.delete(start, end);
      
                          if(stripped != null)
                              return stripped;
                      }
                  }
              }
      
              if(out != null)
                  return out;
              else
                  return null;
          }
      }
      

      然后将这个自定义键侦听器与您的编辑文本一起使用,如下所示:

      EditText myEditText = (EditText)findViewById(R.id.myedittext);
      myEditText.setKeyListener(SignedDecimalKeyListener.getInstance());
      

      【讨论】:

        【解决方案6】:

        我不确定输入类型,但您始终可以创建自己的文本过滤器并将其附加到 editText 字段。那很简单。您可以检查每个字符,只允许使用数字、点或任何您喜欢的自定义字符。

        【讨论】:

          【解决方案7】:

          最终对每个轴使用 Pattern 和 Matcher,而实际的文本输入格式保持打开状态。

          三轴字段,提交按钮触发onSave。验证字段并进行插入,或者向提交者提出有关轴字段所需格式的错误消息。正确的格式是 1-3 位数字,可以选择以“-”开头,也可以选择后跟“.”。和其他数字。

          试试这个代码:

          private View.OnClickListener onSave=new View.OnClickListener(){
              public void onClick(View v){
                  Pattern xAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
                  Matcher mForX = xAxis.matcher(xaxis.getText().toString());
          
                  Pattern yAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
                  Matcher mForY = yAxis.matcher(yaxis.getText().toString());
          
                  Pattern zAxis = Pattern.compile("[-+]?([0-9]*\\.)?[0-9]+");
                  Matcher mForZ = zAxis.matcher(zaxis.getText().toString());
          
                  //If Axis X and Axis Y and Axis Z are all valid entries, the proceed.
                  if(mForX.find() && mForY.find() && mForZ.find()){
                       //handle insert or update statement here
                  }else{
                       //give error message regarding correct Axis value format
                  }
             }
          

          }

          【讨论】:

            【解决方案8】:

            这对我有用。

            etbox.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER);

            【讨论】:

              猜你喜欢
              • 2011-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-20
              • 2011-10-21
              相关资源
              最近更新 更多