【问题标题】:Calculator always showing 0计算器总是显示 0
【发布时间】:2013-12-10 11:29:22
【问题描述】:

我已经在我的应用程序中加入了一个计算器,但由于某种原因,无论我做什么,第一个数字总是为零,所以如果我点击 1,它会显示 01,它不会对结果执行此操作,而是使用 .0 显示结果最后,这对我来说都是问题,因为我绝对是一个初学者,需要这个计算器尽可能简单。

我读到 .0 是一个“双重”问题,但我无法锻炼如何摆脱这两个问题中的任何一个。有人可以为我解释一下吗?这是我的代码。

public class CalcActivity extends Activity implements OnClickListener, OnInitListener {
private EditText Scr;
private float NumberBf;
private String Operation;
private ButtonClickListener btnClick;
private TextToSpeech myTTS;
private int MY_DATA_CHECK_CODE = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_calc);
    Scr = (EditText) findViewById(R.id.editText);
    Scr.setEnabled(false);
    btnClick = new ButtonClickListener();
    Button speakButton = (Button)findViewById(R.id.speak);
    speakButton.setOnClickListener(this);
    Intent checkTTSIntent = new Intent();
    checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    myTTS= new TextToSpeech(this,this);
    startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE);


    int idList[] =  
                     {R.id.button0,R.id.button1,R.id.button2,R.id.button3,
R.id.button4,
R.id.button5,R.id.button6,R.id.button7,
R.id.button8,R.id.button9,R.id.buttonDot,
R.id.buttonAdd,R.id.buttonSub,R.id.buttonMul,
R.id. buttonDiv,R.id.buttonEq,R.id.buttonC
  };

    for(int id:idList){
        View v =(View) findViewById(id);
        v.setOnClickListener(btnClick);
    }
}




public void mMath(String str){
    NumberBf = Float.parseFloat(Scr.getText().toString());
    Operation = str;
    Scr.setText("0");
}
public void getKeyboard(String str){
    String ScrCurrent = Scr.getText().toString();
    ScrCurrent += str;
    Scr.setText(ScrCurrent);

}
public void mResult() {
    float NumAf = Float.parseFloat(Scr.getText().toString());
    float result = 0;
    if(Operation.equals("+")){
        result = NumAf + NumberBf;
    }
    if(Operation.equals("-")){
        result = NumberBf - NumAf;
    }
    if(Operation.equals("*")){
        result = NumAf * NumberBf;
    }
    if(Operation.equals("/")){
        result = NumberBf / NumAf;
    }
Scr.setText(String.valueOf(result));
}

public void onClick(View v) {
    //get the text entered
    EditText enteredText = (EditText)findViewById(R.id.editText);
    String words = enteredText.getText().toString();
    speakWords(words);
}
private void speakWords(String speech) {
    //speak straight away
    myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            myTTS = new TextToSpeech(this, this);
        }
        else {Intent installTTSIntent = new Intent();
            installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installTTSIntent);
        }
    }
}
public void onInit(int initStatus) {
    //check for successful instantiation
    if (initStatus == TextToSpeech.SUCCESS) {
        if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE)
            myTTS.setLanguage(Locale.US);
    }
    else if (initStatus == TextToSpeech.ERROR) {
    Toast.makeText(this, "Sorry! Text To Speech failed...",                

 Toast.LENGTH_LONG).show();
    }
}



private class ButtonClickListener implements View.OnClickListener{
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.buttonC:
                Scr.setText("0");
                NumberBf = 0;
                Operation = "";
                break;
            case R.id.buttonAdd:
                mMath("+");
                break;
            case R.id.buttonSub:
                mMath("-");
                break;
            case R.id.buttonMul:
                mMath("*");
                break;
            case R.id.buttonDiv:
                mMath("/");
                break;
            case R.id.buttonEq:
                mResult();
                break;
            default:
                String numb = ((Button) v).getText().toString();
                getKeyboard(numb);
                break;

        }
    }
}
}

【问题讨论】:

  • 您在提问时确实应该更加具体。这里没有人有时间查看您的长代码并寻找说实话不太清楚的问题。你在哪里点击“1”?在键盘上还是您有带数字的按钮?这段文字显示在哪里?显示此文本的 EditText 的名称是什么?
  • 是的 1 是一个按钮而不是键盘 我很抱歉我没有意识到我是多么含糊但只有一个编辑文本显示它

标签: android decimal calculator


【解决方案1】:

关于你的 .0 结尾 问题,你可以在调用 setText(); 之前使用省略最后两个字符的结果子字符串; 也就是说,如果 str 是您用来通过 Scr.settext 方法分配的字符串变量 在调用 setText 之前放这行代码:

str = str.substring(0,str.length-2);

因此,您最终可以克服 .0 问题。

【讨论】:

  • 好吧,要么这对我不起作用,要么我不知道该把它扔到哪里
  • 把它放在你的 mResult 函数中就在你最后一个 Scr.setText 语句之前。由于您使用的是浮动方法,因此答案 是浮动的。这样一来,您无需改变它,仍然可以实现您想要的。
【解决方案2】:

您总是在 ButtonClickListener 上调用 mMath(_),因此无论您单击哪个按钮,它都会将其设置为“0”

    public void mMath(String str){
    NumberBf = Float.parseFloat(Scr.getText().toString());
    Operation = str;
    Scr.setText("0");  <--
}

【讨论】:

  • 所以我只是将其留空,即:public void mMath(String str){ NumberBf = Float.parseFloat(Scr.getText().toString());操作 = str; Scr.setText(""); }
  • 我也做了同样的结果,所以改变了 Scr.setText("0");到 Scr.setText("");第一个问题已经解决了,非常感谢
猜你喜欢
  • 2016-08-28
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多