在學習android並且遵循教程開發一個小費計算器,它是一個非常好的教程,但是已經完成它,沒有什麼事情發生時,我突然在模擬器中運行它,只是得到一個力量關閉或空白屏幕(這是相當不可預測的)。我該如何解決這個隱藏的android代碼錯誤?
當我調試時,我可以得到的唯一線索是以下消息: [2010-12-05 22:02:01 - 提示計算器] ActivityManager:警告:活動未開始,其當前任務已被帶到前面
我的代碼如下,任何助手或指針如何我可以開始調試/修復這將是最感謝!
package com.tipcalc;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class tipCalc extends Activity {
// Widgets in the Application
private EditText txtAmount;
private EditText txtPeople;
private EditText txtTipOther;
private RadioGroup rdoGroupTips;
private Button btnCalculate;
private Button btnReset;
private TextView txtTipAmount;
private TextView txtTotalToPay;
private TextView txtTipPerPerson;
// For the id of radio button selected
private int radioCheckedId = -1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Access the various widgets by their id in R.java
txtAmount = (EditText) findViewById(R.id.txtAmount);
// On app load, the cursor should be in the amount field
txtAmount.requestFocus();
txtPeople = (EditText) findViewById(R.id.txtPeople);
txtTipOther = (EditText) findViewById(R.id.txtTipOther);
rdoGroupTips = (RadioGroup) findViewById(R.id.rdoGroupTips);
btnCalculate = (Button) findViewById(R.id.btnCalculate);
// On app load the calculate button is disabled
btnCalculate.setEnabled(false);
/*
* Attach an OnCheckedChangeListener to the radio
* Group to monitor the radio buttons selected by user
*
*/
rdoGroupTips.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(RadioGroup group, int checkedId){
// Enable/Disable Other Percentage tip field
if (checkedId == R.id.Radio15 || checkedId == R.id.Radio20){
txtTipOther.setEnabled(false);
// Also enable the calculate button if Total Amount and no of people fields
// have valid values.
btnCalculate.setEnabled(txtAmount.getText().length() > 0
&& txtPeople.getText().length() > 0
);
}
if (checkedId == R.id.RadioOther){
// enable the other % tip field
txtTipOther.setEnabled(true);
// set the focus to this field
txtTipOther.requestFocus();
/*
* Enable the calc button if total amount and no of people
* fields have valid values. Also ensure that the user has
* entered an Other Tip % Value before enabling the calc button
*/
btnCalculate.setEnabled(
txtAmount.getText().length() > 0
&& txtPeople.getText().length() > 0
&& txtTipOther.getText().length() > 0
);
// work out the % rate chosen by the user
radioCheckedId = checkedId;
}
}});
/*
* Create a KeyListener to the tip amount, no of people and other tip % fields
*
*/
txtAmount.setOnKeyListener(mKeyListener);
txtPeople.setOnKeyListener(mKeyListener);
txtTipOther.setOnKeyListener(mKeyListener);
// Attach listener to the Calc and Reset Buttons
btnCalculate.setOnClickListener(mClickListener);
btnReset.setOnClickListener(mClickListener);
}
/*
* OnKeyListener Special Routine
*/
private OnKeyListener mKeyListener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
switch (v.getId()) {
case R.id.txtAmount:
case R.id.txtPeople:
btnCalculate.setEnabled(txtAmount.getText().length() > 0
&& txtPeople.getText().length() > 0);
break;
case R.id.txtTipOther:
btnCalculate.setEnabled(txtAmount.getText().length() > 0
&& txtPeople.getText().length() > 0
&& txtTipOther.getText().length() > 0);
break;
}
return false;
}
};
// ClickListener for the calc and reset buttons
private OnClickListener mClickListener = new OnClickListener(){
@Override
public void onClick(View v){
if(v.getId() == R.id.btnCalculate){
calculate();
} else {
reset();
}
}
};
// Resets the results text views at the bottom of the screen as well as resets the text fields and radio buttons
private void reset() {
txtTipAmount.setText("");
txtTotalToPay.setText("");
txtTipPerPerson.setText("");
txtAmount.setText("");
txtPeople.setText("");
txtTipOther.setText("");
rdoGroupTips.clearCheck();
rdoGroupTips.check(R.id.Radio15);
// set focus on the first field
txtAmount.requestFocus();
}
// Calculate the tip as per data entered by the user
private void calculate() {
Double billAmount = Double.parseDouble(
txtAmount.getText().toString());
Double totalPeople = Double.parseDouble(
txtPeople.getText().toString());
Double percentage = null;
boolean isError = false;
if (billAmount < 1.0) {
showErrorAlert("Enter a vlaid Total Amount.",
txtAmount.getId());
isError = true;
}
if (totalPeople < 1.0) {
showErrorAlert("Enter a valid value for No. of people.",
txtPeople.getId());
isError = true;
}
// If user never changes radio, then verify 15% is correct
if (radioCheckedId == -1) {
radioCheckedId = rdoGroupTips.getCheckedRadioButtonId();
}
if (radioCheckedId == R.id.Radio15) {
percentage = 15.00;
} else if (radioCheckedId == R.id.Radio20) {
percentage = 20.00;
} else if (radioCheckedId == R.id.RadioOther) {
percentage = Double.parseDouble(
txtTipOther.getText().toString());
if (percentage < 1.0) {
showErrorAlert("Enter a valid Tip percentage",
txtTipOther.getId());
isError = true;
}
}
// If all fields are valid, then calc the tips
if(!isError) {
Double tipAmount = ((billAmount * percentage)/100);
Double totalToPay = billAmount + tipAmount;
Double perPersonPays = totalToPay/totalPeople;
txtTipAmount.setText(tipAmount.toString());
txtTotalToPay.setText(totalToPay.toString());
txtTipPerPerson.setText(perPersonPays.toString());
};}
// Show the alerts dialogs
// @param errorMessage - String the Error message to show
// @param fieldId - id of the field which caused the error
private void showErrorAlert(String errorMessage,
final int fieldId) {
new AlertDialog.Builder(this).setTitle("Error")
.setMessage(errorMessage).setNeutralButton("Close",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
findViewById(fieldId).requestFocus();
}
}).show();
};
}