我该如何解决这个隐藏的android代码错误?

问题描述:

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


}; 

} 

“活动未开始,其当前任务已提前”仅表示该活动未重新安装,并且也未真正重新启动,但仍在后台运行,这就是为什么只是将其带回到前端。您可以强制模拟器通过使用Android调试桥(ADB)重新启动应用程序,并终止与您的活动关联的流程。

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

该警告意味着它没有安装新版本,因为您的代码没有从模拟器上的版本更改。您可以直接进入应用程序抽屉,然后再次运行该应用程序以将其带到最前面,或对代码进行更改并重新运行。

此外,您发布的WAY代码太多太多以至于您的问题的描述很少。

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

其次,如果您获得“ActivityManager:警告:活动未启动,它的当前任务已经到达前台”,并且再次运行并安装程序。快速入门是在你的代码示例“abbbbb”中添加一些字母,然后删除它们,再次保存你的程序,然后重新运行它。

希望它有帮助:D