Tengo una aplicación de calculadora que se bloquea cuando se presiona el botón de igualdad y no hay nada en el EditText del que obtiene Textos. He examinado las otras preguntas con situaciones similares, pero esas sugerencias no funcionan. Soy nuevo en Android y me gustaría cualquier ayuda. También tengo el problema si tengo un "0" en mi EditText.setText (), el "0" permanece delante de los otros números cuando se presionan. Avíseme si necesita más código para ayudar.

Aquí está la información de Logcat

09-08 07: 58: 32.915 13726-13726 / com.ruthadeaton.bld3.calculator
  E / AndroidRuntime: EXCEPCIÓN FATAL: principal  Proceso: com.ruthadeaton.bld3.calculator, PID: 13726  java.lang.NumberFormatException: cadena vacía
  atsun.misc.FloatingDecimal.readJavaFormatString  (FloatingDecimal.java:1842)  en sun.misc.FloatingDecimal.parseFloat (FloatingDecimal.java:122)  en java.lang.Float.parseFloat (Float.java:451)  en com.ruthadeaton.bld3.calculator.MainActivity $ 26.onClick  (MainActivity.java: 346)  en android.view.View.performClick (View.java:6597)  en android.view.View.performClickInternal (View.java:6574)  en android.view.View.access $ 3100 (View.java:778)  en android.view.View $ PerformClick.run (View.java:25885)  en android.os.Handler.handleCallback (Handler.java:873)  en android.os.Handler.dispatchMessage (Handler.java:99)  en android.os.Looper.loop (Looper.java:193)  en android.app.ActivityThread.main (ActivityThread.java:6669)  en java.lang.reflect.Method.invoke (Método nativo)  en com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run  (RuntimeInit.java:493)  en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)

Aquí está mi código:

buttonEqual.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mValueTwo=Float.parseFloat(edt1.getText() + "");
            if (mAddition == true) {
                edt1.setText(mValueOne + mValueTwo + "");
                mAddition=false;
            }
            if (mSubtract == true) {
                edt1.setText(mValueOne - mValueTwo + "");
                mSubtract=false;
            }

            if (mMultiplication == true) {
               edt1.setText(mValueOne * mValueTwo + "");
               mMultiplication=false;
            }

            if (mDivision == true) {
                edt1.setText(mValueOne / mValueTwo + "");
                mDivision=false;
            }
        }
    });

button0.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        edt1.setText(edt1.getText() + "0");
    }
});

buttonAdd.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
        mValueOne=Float.parseFloat(edt1.getText() + "");
        mAddition=true;
        edt1.setText(null);
    }
});

buttonSub.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mValueOne=Float.parseFloat(edt1.getText() + "");
        mSubtract=true;
        edt1.setText(null);
    }
});

buttonMul.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mValueOne=Float.parseFloat(edt1.getText() + "");
        mMultiplication=true;
        edt1.setText(null);
    }
});

buttonDivision.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mValueOne=Float.parseFloat(edt1.getText() + "");
        mDivision=true;
        edt1.setText(null);
     }
});
0
B. Deaton 8 sep. 2018 a las 00:30

3 respuestas

La mejor respuesta

Tengo una aplicación de calculadora que se bloquea cuando se presiona el botón de igualdad y no hay nada en el EditText del que obtiene Textos.

Debido a que no valida la entrada de los usuarios es válida o no. Obviamente, la cadena vacía no es un número que explique por qué la aplicación se bloquea con NumberFormatExecption.

También tengo el problema si tengo un "0" en mi EditText.setText (), el "0" permanece delante de los otros números cuando se presionan.

Puede usar TextWatcher para actualizar la vista de texto en función de los aportes de los usuarios.

Te guiaré paso a paso cómo solucionar esos problemas

Primero, defina un método que valida la entrada de los usuarios es un número válido o no.

private boolean isValidNumber(String numberInString) {
    try {
        Float.parseFloat(numberInString);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

En segundo lugar, cada vez que los usuarios presionan un operador aritmético (+, -, *, /) o igual (=), la aplicación obtendrá valor de edt1. Luego escriba un método para hacerlo para evitar el código duplicado.

/**
 * Get current input from user and try parse it to a number.
 *
 * @return a number if input is valid, otherwise return null.
 */
private Float getInputValue() {
    Float possibleNumber = null;
    String numberInString = edt1.getText().toString();
    if (isValidNumber(numberInString)) {
        possibleNumber = Float.parseFloat(numberInString);
    }
    return possibleNumber;
}

Tercero, evite que el usuario agregue más de un número cero usando TextWatcher.

edt1.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        String content = s.toString();
        if (content.startsWith("0") && content.length() == 2 && Character.isDigit(content.charAt(1))) {
            edt1.setText(String.valueOf(content.charAt(1)));
            edt1.setSelection(1);
        }
    }
});

Finalmente ponerlo todo junto.

public class MainActivity extends AppCompatActivity {

    // Your variables here
    ...

    // Make these two variables is Float instead of float.
    Float mValueOne;
    Float mValueTwo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Your init view here
        ...

        edt1.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                String content = s.toString();
                if (content.startsWith("0") && content.length() == 2 && Character.isDigit(content.charAt(1))) {
                    edt1.setText(String.valueOf(content.charAt(1)));
                    edt1.setSelection(1);
                }
            }
        });

        buttonEqual.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mValueTwo = getInputValue();
                if (mValueOne == null || mValueTwo == null) {
                    // One of there or both of two values are not valid then do nothing.
                    return;
                }

                if (mAddition) {
                    edt1.setText(String.valueOf(mValueOne + mValueTwo));
                    mAddition = false;
                }

                if (mSubtract) {
                    edt1.setText(String.valueOf(mValueOne + mValueTwo));
                    mSubtract = false;
                }

                if (mMultiplication) {
                    edt1.setText(String.valueOf(mValueOne + mValueTwo));
                    mMultiplication = false;
                }

                if (mDivision) {
                    edt1.setText(String.valueOf(mValueOne + mValueTwo));
                    mDivision = false;
                }
            }
        });

        button0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                edt1.setText(String.valueOf(edt1.getText().toString() + "0"));
                edt1.setSelection(edt1.getText().length());
            }
        });

        buttonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mValueOne = getInputValue();
                mAddition = true;
                edt1.setText(null);
            }
        });

        buttonSub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mValueOne = getInputValue();
                mSubtract = true;
                edt1.setText(null);
            }
        });

        buttonMul.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mValueOne = getInputValue();
                mMultiplication = true;
                edt1.setText(null);
            }
        });

        buttonDivision.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mValueOne = getInputValue();
                mDivision = true;
                edt1.setText(null);
            }
        });
    }

    /**
     * Get current input from user and try parse it to a number.
     *
     * @return a number if input is valid, otherwise return null.
     */
    private Float getInputValue() {
        Float possibleNumber = null;
        String numberInString = edt1.getText().toString();
        if (isValidNumber(numberInString)) {
            possibleNumber = Float.parseFloat(numberInString);
        }
        return possibleNumber;
    }

    private boolean isValidNumber(String numberInString) {
        try {
            Float.parseFloat(numberInString);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}
1
Son Truong 8 sep. 2018 a las 01:14

Puede establecer un atributo de sugerencia en su texto de edición para que desaparezca cada vez que se inserte un número.

android:hint="0"

También para el 0 al frente, tal vez desee que su texto de edición tenga el formato de número

android:inputType = "numberDecimal"

No pegó un seguimiento de pila del bloqueo, pero supondré que es una excepción de puntero nulo

if (edt1.getText != null) { /* do whatever executions */}
0
i am E 7 sep. 2018 a las 21:56

No puede hacer un

mValueTwo=Float.parseFloat(edt1.getText() + "");

Si edt1.getText () está vacío. Puede corregir esto usando un try-catch.

buttonEqual.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try{
                mValueTwo=Float.parseFloat(edt1.getText() + "");

                if (mAddition == true) {

                    edt1.setText(mValueOne + mValueTwo + "");
                    mAddition=false;
                }

                if (mSubtract == true) {
                    edt1.setText(mValueOne - mValueTwo + "");
                    mSubtract=false;
                }

                if (mMultiplication == true) {
                    edt1.setText(mValueOne * mValueTwo + "");
                    mMultiplication=false;
                }

                if (mDivision == true) {
                    edt1.setText(mValueOne / mValueTwo + "");
                    mDivision=false;
                }
            }catch(Exception e){
                //eventually logging here
            } 
        }
   });

De lo contrario, puede hacer algunos controles antes de hacer el análisis.

buttonEqual.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
            String edt = edt1.getText().toString();
            if(edt.matches("")){
                //something like a toast to signal
            }else{
                   mValueTwo=Float.parseFloat(edt1.getText() + "");

                    if (mAddition == true) {

                        edt1.setText(mValueOne + mValueTwo + "");
                        mAddition=false;
                    }

                    if (mSubtract == true) {
                        edt1.setText(mValueOne - mValueTwo + "");
                        mSubtract=false;
                    }

                    if (mMultiplication == true) {
                        edt1.setText(mValueOne * mValueTwo + "");
                        mMultiplication=false;
                    }

                    if (mDivision == true) {
                        edt1.setText(mValueOne / mValueTwo + "");
                        mDivision=false;
                    }
                }
            }
       });
1
Heichou 7 sep. 2018 a las 23:50