如何修复隐藏的这个android代码错误?

时间:2010-12-05 22:04:39

标签: android debugging

我正在学习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();


 };

 }

3 个答案:

答案 0 :(得分:2)

该警告意味着它没有安装新版本,因为您的代码没有从模拟器上的版本更改。您只需转到应用程序抽屉并再次运行该应用程序即可将其置于最前面,或对代码进行更改并重新运行。

此外,您发布了太多代码来解决您的问题。

答案 1 :(得分:1)

如果你的程序没有在模拟器上运行并且你得到“强制关闭或空白屏幕”,你可能没有正确地遵循教程。您可能在清单文件中缺少某些权限,或者可绘制文件夹中可能没有图像或任何其他错误。您必须提供错误的日志cat输出。

其次,如果你得到“ActivityManager:警告:活动未启动,其当前任务已被置于最前面”,并再次运行并安装程序。快速破解是在代码示例“abbbbb”中添加一些字母然后删除它们,再次保存程序然后重新运行它。

希望它有所帮助:D

答案 2 :(得分:0)

“活动未启动,其当前任务已被带到前面”只是意味着活动没有重新安装,它也没有真正重新启动但仍然在后台运行,这就是为什么只是被带回到前面。您可以使用Android Debug Bridge(ADB)强制模拟器重新启动应用程序,并终止与您的活动相关联的进程。

这是你第一个问题的答案。要解决此问题,有必要发布强制关闭消息出现时的堆栈跟踪。您可以从Logcat复制此堆栈跟踪。