package steven.mcilhone.calculatorcoursework;
import java.math.BigDecimal;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Calculator extends Activity {
EditText firstValue;
EditText secondValue;
TextView result;
Button addbtn, subtractbtn, dividebtn, multiplybtn, equalbtn, clearbtn;
BigDecimal firstNum, secondNum;
String Operator = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculator);
addbtn = (Button) findViewById(R.id.addbtnID);
subtractbtn = (Button) findViewById(R.id.subtractbtnID);
dividebtn = (Button) findViewById(R.id.dividebtnID);
multiplybtn = (Button) findViewById(R.id.multiplybtnID);
equalbtn = (Button) findViewById(R.id.equalbtnID);
clearbtn = (Button) findViewById(R.id.clearbtn);
firstValue = (EditText) findViewById(R.id.edttxt1);
secondValue = (EditText) findViewById(R.id.edttxt1);
clearbtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
EditText edttxt1 = (EditText) findViewById(R.id.edttxt1);
edttxt1.setText("");
}
});
addbtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Operator = "+";
addandclear();
}
});
subtractbtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Operator = "-";
addandclear();
}
});
dividebtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Operator = "/";
addandclear();
}
});
multiplybtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Operator = "*";
addandclear();
}
});
equalbtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
secondNum = new BigDecimal(secondValue.getText().toString());
EditText edttxt1 = (EditText) findViewById(R.id.edttxt1);
edttxt1.setText("");
if (Operator == "+"){
edttxt1.setText(firstNum.add(secondNum).toString());
}
else if (Operator == "-"){
edttxt1.setText(firstNum.subtract(secondNum).toString());
}
else if (Operator == "/"){
edttxt1.setText(firstNum.divide(secondNum).toString());
}
else if (Operator == "*"){
edttxt1.setText(firstNum.multiply(secondNum).toString());
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_calculator, menu);
return true;
}
public void addandclear(){
firstNum = new BigDecimal(firstValue.getText().toString());
EditText edttxt1 = (EditText) findViewById(R.id.edttxt1);
edttxt1.setText("");
}
}
<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" >
<EditText
android:id="@+id/edttxt1"
android:layout_width="250dp"
android:layout_height="100dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="?android:attr/editTextBackground"
android:ems="15"
android:inputType="numberDecimal"
android:gravity="right"/>
<Button
android:id="@+id/addbtnID"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_below="@+id/edttxt1"
android:layout_marginLeft="20dp"
android:text="@string/add" />
<Button
android:id="@+id/dividebtnID"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_below="@+id/edttxt1"
android:layout_toRightOf="@+id/addbtnID"
android:text="@string/divide" />
<Button
android:id="@+id/multiplybtnID"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_below="@+id/edttxt1"
android:layout_toRightOf="@+id/dividebtnID"
android:text="@string/multiply" />
<Button
android:id="@+id/subtractbtnID"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignBaseline="@+id/multiplybtnID"
android:layout_alignBottom="@+id/multiplybtnID"
android:layout_toRightOf="@+id/multiplybtnID"
android:text="@string/subtract" />
<Button
android:id="@+id/zerobtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignLeft="@+id/addbtnID"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/twobtn"
android:text="@string/zero" />
<Button
android:id="@+id/onebtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_above="@+id/zerobtn"
android:layout_alignLeft="@+id/zerobtn"
android:text="@string/one" />
<Button
android:id="@+id/twobtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_above="@+id/zerobtn"
android:layout_toLeftOf="@+id/multiplybtnID"
android:text="@string/two" />
<Button
android:id="@+id/threebtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_above="@+id/zerobtn"
android:layout_toLeftOf="@+id/subtractbtnID"
android:text="@string/three" />
<Button
android:id="@+id/fourbtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_above="@+id/onebtn"
android:layout_toLeftOf="@+id/twobtn"
android:text="@string/four" />
<Button
android:id="@+id/fivebtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignBaseline="@+id/fourbtn"
android:layout_alignBottom="@+id/fourbtn"
android:layout_toLeftOf="@+id/threebtn"
android:text="@string/five" />
<Button
android:id="@+id/sixbtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignBaseline="@+id/fivebtn"
android:layout_alignBottom="@+id/fivebtn"
android:layout_toRightOf="@+id/fivebtn"
android:text="@string/six" />
<Button
android:id="@+id/sevenbtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_above="@+id/fourbtn"
android:layout_toLeftOf="@+id/fivebtn"
android:text="@string/seven" />
<Button
android:id="@+id/eightbtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_above="@+id/fivebtn"
android:layout_toLeftOf="@+id/sixbtn"
android:text="@string/eight" />
<Button
android:id="@+id/ninebtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_alignBaseline="@+id/eightbtn"
android:layout_alignBottom="@+id/eightbtn"
android:layout_toRightOf="@+id/eightbtn"
android:text="@string/nine" />
<Button
android:id="@+id/equalbtnID"
android:layout_width="70dp"
android:layout_height="120dp"
android:layout_alignBottom="@+id/threebtn"
android:layout_alignTop="@+id/sixbtn"
android:layout_toRightOf="@+id/threebtn"
android:text="@string/equal" />
<Button
android:id="@+id/clearbtn"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_above="@+id/equalbtnID"
android:layout_alignLeft="@+id/equalbtnID"
android:text="@string/clear" />
</RelativeLayout>
答案 0 :(得分:6)
if (Operator == "+"){
应该是
if (Operator.eqauls("+")){
同样适用于代码中的其他if / else块。
在比较字符串时,我们.equals()
而不是==
总是更好(除了字符串文字的情况,字符串文字可能会传递==条件)。
==
检查引用相等性。 equals()
检查内容是否相等。 This discussion可能会对您有所帮助。
修改强>
正如TedHopp评论的那样,你的代码引用了编译时常量,字符串比较在这里可能不是问题,仍然是上面的答案仍然是字符串比较的好习惯。
因为没有可用的堆栈跟踪问题,假设flow满足if / else条件之一,另一种错误可能性是NumberFormatException
。
在创建EditText
实例之前,请确保您从BigDecimal(String)
读取的数字是有效数字。
答案 1 :(得分:4)
在多个地方,您将用户输入转换为BigDecimal
而不进行任何错误检查。特别是,当没有输入时,new BigDecimal(String)
将生成NumberFormatException
,因为“”不是有效数字。来自the docs:
字符串必须包含整数或小数中的至少一个数字。
查找您使用用户输入的每个位置并进行一些错误检查。例如,在addandclear()
:
public void addandclear(){
String val = firstValue.getText().toString();
try {
firstNum = new BigDecimal(val);
EditText edttxt1 = (EditText) findViewById(R.id.edttxt1);
edttxt1.setText("");
} catch (NumberFormatException e) {
if (val.length() == 0) {
// blank field
} else {
// something wrong with the input
}
}
}
答案 2 :(得分:0)
要减少代码,您可以将android:onClick =“addandclear”添加到xml中的按钮(make addandclear将View v作为参数)。然后通过v.getText()。toString()
获取运算符