Java 我想建立一个简单的计算器
我忘了什么重要的东西了吗?B/c Android Studio没有给出任何错误,但当运行应用程序并按下按钮(计算)时,应用程序立即崩溃 错误如下: “不幸的是,Calc已停止。” Java代码(callation.Java): XML代码(activity_callation.XML):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" 你的按钮在哪里。只需将此
你能检查一下我的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);
}