我忘了必不可少的东西吗? B / c Android Studio不会出现任何错误,但在运行应用程序并按下按钮(CALCULATE)时,应用程序会立即崩溃。
错误如下:
“不幸的是,Calc已经停止了。”
Java代码(callation.java):
package com.iodine.calc;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class callation extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_callation);
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;
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_callation, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
XML代码(activity_callation.xml):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".callation">
<EditText
android:layout_width="300dp"
android:layout_height="50dp"
android:id="@+id/number1"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="56dp"
android:inputType="number" />
<EditText
android:layout_width="300dp"
android:layout_height="50dp"
android:id="@+id/number2"
android:layout_marginTop="64dp"
android:layout_below="@+id/number1"
android:layout_alignLeft="@+id/number1"
android:layout_alignStart="@+id/number1"
android:inputType="number" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/plus"
android:id="@+id/plus"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/minus"
android:id="@+id/minus"
android:layout_above="@+id/multiply"
android:layout_centerHorizontal="true" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/multiply"
android:id="@+id/multiply"
android:layout_below="@+id/plus"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="29dp" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/divide"
android:id="@+id/divide"
android:layout_alignTop="@+id/multiply"
android:layout_alignLeft="@+id/minus"
android:layout_alignStart="@+id/minus" />
<TextView
android:layout_width="300dp"
android:layout_height="50dp"
android:id="@+id/answer"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="64dp"
android:textColorHighlight="#010101"
android:textSize="14sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/calc"
android:id="@+id/button"
android:layout_below="@+id/minus"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
请检查我的Java和/或XML代码吗?如果你能纠正我的错误并找到解决方案,我将不胜感激。提前谢谢。
答案 0 :(得分:1)
首先这将崩溃:
go()
您无法解析空值。因为你永远不会刷新am1或pm1(因为你将它们设置为final而无法解决)它们是null,因为它们仅在init上设置。这就是我猜你的崩溃正在发生的地方。
其他想法:
即使它没有崩溃也不会起作用,因为监听器只在等号按钮上,并且你试图从传入的视图中选择哪个单选按钮到onclick。这将始终是抛出事件(在本例中为calc按钮)。为了解决这个问题,将单选按钮放在一个无线电组中,然后从中选择哪一个。
在设置之前,您不必预设编辑文本...
final Double number1 = Double.parseDouble(am1);
到
EditText am = new EditText(this);
EditText pm = new EditText(this);
Button b = new Button(this);
am1和pm1不需要在听众之外将它们放入其中这也不会让你必须将它们设置为最终(这不是你在第一个地方,但我得到的是那个为什么你把它们设置为最终的)
还有其他错误,但这会让你开始。
另外一个重要的事情是你为你的按钮命名,onClick将参数传递给同一个东西(b)这是REALY!坏。
下次你问这样的问题时也要加上LOGCAT。你可以在android studio底部的android选项卡上找到它。
答案 1 :(得分:0)
这行代码非常棘手:
final Double number1 = Double.parseDouble(am1);
final Double number2 = Double.parseDouble(pm1);
总而言之,请记住,如果你解析,你需要用try / catch块包围它。如果用户写的东西不能被解析成双值(例如字母)这行代码,将抛出异常
NumberFormatException - 如果无法将字符串解析为double值。
这是你可以改变以避免这种情况:
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);
}
这样你只需要祝酒,你就可以避免异常。
答案 2 :(得分:-1)
我想你不小心忘记了:
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;
}
}
然后像这样设置onClick:
android:onClick="calcFunc"