【问题标题】:NumberFormatException: Invalid int "-"NumberFormatException: 无效的 int "-"
【发布时间】:2014-06-26 10:02:34
【问题描述】:

我有问题。我有一个具有android:inputType="numberDecimal|numberSigned" 的 EditText。在 Java 代码中我有这个

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
                int value = 0;
                String editContent = editText.getText().toString();
                if(editContent != null && editContent.length() > 0) {
                    value = Integer.parseInt(editContent);
                } 
                seekBar.setProgress(value);
            }

当我尝试插入一个负数时,我有一个 NumberFormatException Invalid int "-"。我该如何解决这个问题?

【问题讨论】:

  • 如何设置Progress 为负值?
  • Micro pravi 我有一个接受负数的自定义搜索栏
  • 您似乎正在尝试将单个字符('-')解析为整数。每次输入字符时都会调用 onTextChanged。
  • 是的,但我不知道如何解决这个问题。我阅读了 Saif 发布的链接,但我不明白如何修复...

标签: java android xml


【解决方案1】:

第一次输入“-”时,会调用方法onTextChanged,解析会在“-”上进行,这不是一个有效的int。 因此,如果字符串为“-”,则需要转义解析。


onTextChanged(...) 中使用以下代码。 最好将此代码移至afterTextChanged(...)

int value = 0;
if (! TextUtils.isEmpty(arg0)) {
    String text = arg0.toString();
    if ("-".equals(text)) {
        // Nothing to do
    } else {
        value = Integer.parseInt(text);
    }
    seekBar.setProgress(value);
}

【讨论】:

  • 在你的情况下arg0。您作为 onTextChanged(CharSequence arg0, .... ) 的参数列表获得的 CharSequesnce 变量
【解决方案2】:

在 EditText 的布局中添加这个:

android:digits="0123456789-."

【讨论】:

    【解决方案3】:

    试试这个

     @Override
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
       // TODO Auto-generated method stub
       int value = 0;
       String editContent = editText.getText().toString();
       if(editContent != null && editContent.length() > 0 && !editContent.equals("-")) {
         value = Integer.parseInt(editContent);
       } 
         seekBar.setProgress(value);
      }
    

    由于在输入每个字符后都会调用 onTextChanged,因此您尝试将“-”字符解析为整数,这会导致异常。使用修改后的代码,您将在这些情况下将值设置为 0。

    【讨论】:

    • 我也需要接受负数,这样我不能插入负数。
    • 其实可以的。您只需忽略第一个输入。这就是为什么我写它会将值设置为 0(您可以轻松更改)。但很高兴您找到了解决方案。
    【解决方案4】:

    这是因为无法从"-" 字符串解析整数。 您可以添加try-catch 块:

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
                try{
                    int value = 0;
                    String editContent = editText.getText().toString();
                    if(editContent != null && editContent.length() > 0) {
                        value = Integer.parseInt(editContent);
                    } 
                    seekBar.setProgress(value);
                }catch(NumberFormatException ex){
                }
            }
    

    或使用if构造:

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
                int value = 0;
                String editContent = editText.getText().toString();
    
                if(editContent != null && !editContent.equals("-")){
                    if(editContent != null && editContent.length() > 0) {
                        value = Integer.parseInt(editContent);
                    } 
                    seekBar.setProgress(value);
                }
            }
    

    【讨论】:

      【解决方案5】:

      添加检查以查看editContent是否以 - 开头

      @Override
       public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        int value = 0;
        String editContent = editText.getText().toString();
      
        if(editContent != null && editContent.length() > 0 && !editContent.startsWith("-")) 
        {
            value = Integer.parseInt(editContent);
        } 
        seekBar.setProgress(value);
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-24
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        相关资源
        最近更新 更多