Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想建立一个简单的计算器_Java_Android_Xml_Calculator - Fatal编程技术网

Java 我想建立一个简单的计算器

Java 我想建立一个简单的计算器,java,android,xml,calculator,Java,Android,Xml,Calculator,我忘了什么重要的东西了吗?B/c Android Studio没有给出任何错误,但当运行应用程序并按下按钮(计算)时,应用程序立即崩溃 错误如下: “不幸的是,Calc已停止。” Java代码(callation.Java): XML代码(activity_callation.XML): 你能检查一下我的Java和/或XML代码吗?如果你能纠正我的错误并找到解决办法,我将不胜感激。提前谢谢。我想你不小心忘了: android:onClick="whatever" 你的按钮在哪里。只需将此

我忘了什么重要的东西了吗?B/c Android Studio没有给出任何错误,但当运行应用程序并按下按钮(计算)时,应用程序立即崩溃

错误如下:

“不幸的是,Calc已停止。”

Java代码(callation.Java):

XML代码(activity_callation.XML):



你能检查一下我的Java和/或XML代码吗?如果你能纠正我的错误并找到解决办法,我将不胜感激。提前谢谢。

我想你不小心忘了:

android:onClick="whatever"
你的按钮在哪里。只需将此函数放在calc按钮XML中即可。在双引号中放入函数,或者在您的例子中,我建议创建一个名为calcFunc的新方法,并将onClick放入其中,如下所示:

public void calcFunc(View view){
  EditText am = new EditText(this);
  EditText pm = new EditText(this);
  Button b = new Button(this);

  am = (EditText) findViewById(R.id.number1);
  pm = (EditText) findViewById(R.id.number2);
  final TextView om = (TextView) findViewById(R.id.answer);
  final String am1 = am.getText().toString();
  final String pm1 = pm.getText().toString();
  b = (Button) findViewById(R.id.button);
  b.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View b){
        om.setText(am1);
        final Double number1 = Double.parseDouble(am1);
        final Double number2 = Double.parseDouble(pm1);

        switch (b.getId()) {
            case R.id.plus:
             Double totalD = number1 + number2;
             String totalS = Double.toString(totalD);
             om.setText("The answer is: " + totalS);
                break;
            case R.id.minus:
                Double totalD1 = number1 - number2;
                String totalS1 = Double.toString(totalD1);
                om.setText("The answer is: " + totalS1);
                break;
            case R.id.multiply:
                Double totalD2 = number1 * number2;
                String totalS2 = Double.toString(totalD2);
                om.setText("The answer is: " + totalS2);
                break;
            case R.id.divide:
                Double totalD3 = number1 / number2;
                String totalS3 = Double.toString(totalD3);
                om.setText("The answer is: " + totalS3);
                break;

    }
}
 android:onClick="calcFunc"
然后按如下方式设置onClick:

public void calcFunc(View view){
  EditText am = new EditText(this);
  EditText pm = new EditText(this);
  Button b = new Button(this);

  am = (EditText) findViewById(R.id.number1);
  pm = (EditText) findViewById(R.id.number2);
  final TextView om = (TextView) findViewById(R.id.answer);
  final String am1 = am.getText().toString();
  final String pm1 = pm.getText().toString();
  b = (Button) findViewById(R.id.button);
  b.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View b){
        om.setText(am1);
        final Double number1 = Double.parseDouble(am1);
        final Double number2 = Double.parseDouble(pm1);

        switch (b.getId()) {
            case R.id.plus:
             Double totalD = number1 + number2;
             String totalS = Double.toString(totalD);
             om.setText("The answer is: " + totalS);
                break;
            case R.id.minus:
                Double totalD1 = number1 - number2;
                String totalS1 = Double.toString(totalD1);
                om.setText("The answer is: " + totalS1);
                break;
            case R.id.multiply:
                Double totalD2 = number1 * number2;
                String totalS2 = Double.toString(totalD2);
                om.setText("The answer is: " + totalS2);
                break;
            case R.id.divide:
                Double totalD3 = number1 / number2;
                String totalS3 = Double.toString(totalD3);
                om.setText("The answer is: " + totalS3);
                break;

    }
}
 android:onClick="calcFunc"

首先,这将崩溃:

final Double number1 = Double.parseDouble(am1);
不能分析空值。由于您从不刷新am1或pm1(因为您将它们设置为final,所以无论如何都无法刷新),因此它们为空,因为它们仅在init上设置。我猜你的坠机就是在那里发生的

其他想法:

即使它没有崩溃,这也不会起作用,因为侦听器只在equals按钮上,并且您正在尝试从传递到onclick的passed-in视图中选择哪个单选按钮。这将始终是引发事件的原因(在本例中是“计算”按钮)。要解决这个问题,请将单选按钮放入单选组,然后从中选择一个

您不必预设编辑文本。。。在设置它们之前:

EditText am = new EditText(this);
EditText pm = new EditText(this);
Button b = new Button(this);

am1和pm1不需要在监听器外部,将它们放在内部也不会使您必须将它们设置为final(您首先不需要设置为final,但我明白这就是为什么您将它们设置为final)

还有其他错误,但这将帮助您开始

还有一件很重要的事情,你给你的按钮命名,并把onClick的pass-in参数指定给同一个东西(b)这是真的!糟糕


另外,下次你问这样的问题时,添加LOGCAT。您可以在android studio底部的android选项卡上找到它

这行代码非常棘手:

final Double number1 = Double.parseDouble(am1);
final Double number2 = Double.parseDouble(pm1);
始终记住,如果你解析它,你需要用try/catch块来包围它。如果用户写了一些不能解析成双值的东西(比如一个字母),这行代码将抛出和异常

NumberFormatException-如果字符串不能解析为双精度值

这是您可以更改的内容,以避免:

try {
        final Double number1 = Double.parseDouble(am1);
        final Double number2 = Double.parseDouble(pm1);
    } catch (NumberFormatException e) {
        Toast.makeText(this, "Please insert only numeric values!", Toast.LENGTH_SHORT);
    }

通过这种方式,您只需敬酒,就可以避免出现异常。

您应该在crashIt的android操作系统错误中发布您遇到的错误,如:“不幸的是,Calc已停止”。我一单击按钮,就会发生这种情况。(Calc是我的应用程序的名称)就像我说的:Android Studio在运行代码时不会给出任何错误。你应该从LOGCAT中获得错误,而不是从用户通常收到的消息中获得错误。这不会有什么区别,因为
OnClickListener
是通过编程方式设置的。此外,您的代码将无法正常工作,因为应该运行的代码位于侦听器中,在第二次按下按钮之前不会被调用。
try {
        final Double number1 = Double.parseDouble(am1);
        final Double number2 = Double.parseDouble(pm1);
    } catch (NumberFormatException e) {
        Toast.makeText(this, "Please insert only numeric values!", Toast.LENGTH_SHORT);
    }