我是安卓新手。我使用 android 开发了一个简单的计算器,但无法运行它。我在运行它时遇到空指针异常。activity_main.xml 文件是
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/txtCalc"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="0"
/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:layout_weight="1"
>
<Button
android:id="@+id/btnSeven"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="7" />
<Button
android:id="@+id/btnEight"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="8"/>
<Button
android:id="@+id/btnNine"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="9"/>
<Button
android:id="@+id/btnDivide"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="/"/>
<Button
android:id="@+id/btnC"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="C"/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:layout_weight="1"
>
<Button
android:id="@+id/btnFour"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="4"
/>
<Button
android:id="@+id/btnFive"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="5"
/>
<Button
android:id="@+id/btnSix"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="6"
/>
<Button
android:id="@+id/btnMultiply"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="*"
/>
<Button
android:id="@+id/btnPerc"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="%"
/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="horizontal" >
<Button
android:id="@+id/btnOne"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="1"
/>
<Button
android:id="@+id/btnTwo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="2"
/>
<Button
android:id="@+id/btnThree"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="3"
/>
<Button
android:id="@+id/btnMinus"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="-"
/>
<Button
android:id="@+id/btnSqrRoot"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="√"
/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="horizontal" >
<Button
android:id="@+id/btnZero"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="0"
/>
<Button
android:id="@+id/btnDecimal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="."
/>
<Button
android:id="@+id/btnPM"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="+/-"
/>
<Button
android:id="@+id/btnPlus"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="+"
/>
<Button
android:id="@+id/btnEquals"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="="
/>
</LinearLayout>
</LinearLayout>
MainActivity 文件的内容是
package com.example.calculator;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private final String SDK_VERSION = "1";
private final int MENUITEM_CLOSE = 300;
/*
* Edit Text and Button object initialization for simple calculator design.
*/
private EditText txtCalc = null;
private Button btnZero = null;
private Button btnOne = null;
private Button btnTwo = null;
private Button btnThree = null;
private Button btnFour = null;
private Button btnFive = null;
private Button btnSix = null;
private Button btnSeven = null;
private Button btnEight = null;
private Button btnNine = null;
private Button btnPlus = null;
private Button btnMinus = null;
private Button btnMultiply = null;
private Button btnDivide = null;
private Button btnEquals = null;
private Button btnC = null;
private Button btnDecimal = null;
private Button btnBS = null;
private Button btnPerc = null;
private Button btnSqrRoot = null;
private Button btnPM = null;
private double num = 0;
private int operator = 1;
// 0 = nothing, 1 = plus, 2 = minus, 3 =
// multiply, 4 = divide
private boolean readyToClear = false;
private boolean hasChanged = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme_Black);
setContentView(R.layout.activity_main);
this.setTitle("SimpleCalculator " + SDK_VERSION);
initControls();
//initScreenLayout();
reset();
}
private void initControls() {
txtCalc = (EditText) findViewById(R.id.txtCalc);
btnZero = (Button) findViewById(R.id.btnZero);
btnOne = (Button) findViewById(R.id.btnOne);
btnTwo = (Button) findViewById(R.id.btnTwo);
btnThree = (Button) findViewById(R.id.btnThree);
btnFour = (Button) findViewById(R.id.btnFour);
btnFive = (Button) findViewById(R.id.btnFive);
btnSix = (Button) findViewById(R.id.btnSix);
btnSeven = (Button) findViewById(R.id.btnSeven);
btnEight = (Button) findViewById(R.id.btnEight);
btnNine = (Button) findViewById(R.id.btnNine);
btnPlus = (Button) findViewById(R.id.btnPlus);
btnMinus = (Button) findViewById(R.id.btnMinus);
btnMultiply = (Button) findViewById(R.id.btnMultiply);
btnDivide = (Button) findViewById(R.id.btnDivide);
btnEquals = (Button) findViewById(R.id.btnEquals);
btnC = (Button) findViewById(R.id.btnC);
btnDecimal = (Button) findViewById(R.id.btnDecimal);
btnPerc = (Button) findViewById(R.id.btnPerc);
btnSqrRoot = (Button) findViewById(R.id.btnSqrRoot);
btnPM = (Button) findViewById(R.id.btnPM);
btnZero.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(0);
}
});
btnOne.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(1);
}
});
btnTwo.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(2);
}
});
btnThree.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(3);
}
});
btnFour.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(4);
}
});
btnFive.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(5);
}
});
btnSix.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(6);
}
});
btnSeven.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(7);
}
});
btnEight.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(8);
}
});
btnNine.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleNumber(9);
}
});
btnPlus.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(1);
}
});
btnMinus.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(2);
}
});
btnMultiply.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(3);
}
});
btnDivide.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(4);
}
});
btnEquals.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleEquals(0);
}
});
btnC.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
reset();
}
});
btnDecimal.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleDecimal();
}
});
btnPM.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handlePlusMinus();
}
});
btnBS.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
handleBackspace();
}
});
btnSqrRoot.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
setValue(Double.toString(Math.sqrt(Double.parseDouble(txtCalc
.getText().toString()))));
}
});
btnPerc.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
setValue(Double.toString(num
* (0.01 * Double.parseDouble(txtCalc.getText()
.toString()))));
}
});
txtCalc.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int i, android.view.KeyEvent e) {
if (e.getAction() == KeyEvent.ACTION_DOWN) {
int keyCode = e.getKeyCode();
// txtCalc.append("["+Integer.toString(keyCode)+"]");
switch (keyCode) {
case KeyEvent.KEYCODE_0:
handleNumber(0);
break;
case KeyEvent.KEYCODE_1:
handleNumber(1);
break;
case KeyEvent.KEYCODE_2:
handleNumber(2);
break;
case KeyEvent.KEYCODE_3:
handleNumber(3);
break;
case KeyEvent.KEYCODE_4:
handleNumber(4);
break;
case KeyEvent.KEYCODE_5:
handleNumber(5);
break;
case KeyEvent.KEYCODE_6:
handleNumber(6);
break;
case KeyEvent.KEYCODE_7:
handleNumber(7);
break;
case KeyEvent.KEYCODE_8:
handleNumber(8);
break;
case KeyEvent.KEYCODE_9:
handleNumber(9);
break;
case 43:
handleEquals(1);
break;
case KeyEvent.KEYCODE_EQUALS:
handleEquals(0);
break;
case KeyEvent.KEYCODE_MINUS:
handleEquals(2);
break;
case KeyEvent.KEYCODE_PERIOD:
handleDecimal();
break;
case KeyEvent.KEYCODE_C:
reset();
break;
case KeyEvent.KEYCODE_SLASH:
handleEquals(4);
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
return false;
}
}
return true;
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, MENUITEM_CLOSE, "Close");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENUITEM_CLOSE:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
private void handleEquals(int newOperator) {
if (hasChanged) {
switch (operator) {
case 1:
num = num + Double.parseDouble(txtCalc.getText().toString());
break;
case 2:
num = num - Double.parseDouble(txtCalc.getText().toString());
break;
case 3:
num = num * Double.parseDouble(txtCalc.getText().toString());
break;
case 4:
num = num / Double.parseDouble(txtCalc.getText().toString());
break;
}
String txt = Double.toString(num);
txtCalc.setText(txt);
txtCalc.setSelection(txt.length());
readyToClear = true;
hasChanged = false;
}
operator = newOperator;
}
private void handleNumber(int num) {
if (operator == 0)
reset();
String txt = txtCalc.getText().toString();
if (readyToClear) {
txt = "";
readyToClear = false;
} else if (txt.equals("0"))
txt = "";
txt = txt + Integer.toString(num);
txtCalc.setText(txt);
txtCalc.setSelection(txt.length());
hasChanged = true;
}
private void setValue(String value) {
if (operator == 0)
reset();
if (readyToClear) {
readyToClear = false;
}
txtCalc.setText(value);
txtCalc.setSelection(value.length());
hasChanged = true;
}
private void handleDecimal() {
if (operator == 0)
reset();
if (readyToClear) {
txtCalc.setText("0.");
txtCalc.setSelection(2);
readyToClear = false;
hasChanged = true;
} else {
String txt = txtCalc.getText().toString();
if (!txt.contains(".")) {
txtCalc.append(".");
hasChanged = true;
}
}
}
private void handleBackspace() {
if (!readyToClear) {
String txt = txtCalc.getText().toString();
if (txt.length() > 0) {
txt = txt.substring(0, txt.length() - 1);
if (txt.equals(""))
txt = "0";
txtCalc.setText(txt);
txtCalc.setSelection(txt.length());
}
}
}
private void handlePlusMinus() {
if (!readyToClear) {
String txt = txtCalc.getText().toString();
if (!txt.equals("0")) {
if (txt.charAt(0) == '-')
txt = txt.substring(1, txt.length());
else
txt = "-" + txt;
txtCalc.setText(txt);
txtCalc.setSelection(txt.length());
}
}
}
private void reset() {
num = 0;
txtCalc.setText("0");
txtCalc.setSelection(1);
operator = 1;
}
}
谁能告诉我哪里出错了,因为无法弄清楚我的错误。