-
简单写了一个Android计算器,事件处理代码一团糟,该如何优化?5
大家好:
刚刚开始学习Android开发,写了一个简单的计算器,主要是为了熟悉界面布局和事件处理。我写的代码很蠢,在一个主Activity中,一个按钮添加一个事件,请问有什么好的模式可以优化一下这种代码,谢谢!package com.wondershare.calculator; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Calculator extends Activity { private String number1 = null; private String number2 = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final EditText editText = (EditText) findViewById(R.id.editText); Button del = (Button) findViewById(R.id.del); del.setOnClickListener(new OnClickListener() { //有问题 @Override public void onClick(View v) { // Editable str = editText.getText(); // if(!str.equals("")){ // int length = str.length(); // str.delete(length-1, length); // editText.setText(str); // } editText.getText().clear(); } }); final Button digit0 = (Button) findViewById(R.id.digit0); digit0.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String str = (String) digit0.getText(); if (str.equals("")) { } else { editText.append(digit0.getText()); } } }); final Button digit1 = (Button) findViewById(R.id.digit1); digit1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit1.getText()); } }); final Button digit2 = (Button) findViewById(R.id.digit2); digit2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit2.getText()); } }); final Button digit3 = (Button) findViewById(R.id.digit3); digit3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit3.getText()); } }); final Button digit4 = (Button) findViewById(R.id.digit4); digit4.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit4.getText()); } }); final Button digit5 = (Button) findViewById(R.id.digit5); digit5.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit5.getText()); } }); final Button digit6 = (Button) findViewById(R.id.digit6); digit6.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit6.getText()); } }); final Button digit7 = (Button) findViewById(R.id.digit7); digit7.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit7.getText()); } }); final Button digit8 = (Button) findViewById(R.id.digit8); digit8.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit8.getText()); } }); final Button digit9 = (Button) findViewById(R.id.digit9); digit9.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(digit9.getText()); } }); final Button div = (Button) findViewById(R.id.div); div.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { number1 = editText.getText().toString(); editText.append(div.getText()); } }); final Button dot = (Button) findViewById(R.id.dot); dot.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { editText.append(dot.getText()); } }); final Button equal = (Button) findViewById(R.id.equal); equal.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String str = editText.getText().toString();//文本 number2 = str.substring(number1.length()+1, str.length()); String operation = str.substring(number1.length(), number1.length()+1); float result = 0; if(operation.equals("+")){ result = Float.parseFloat(number1)+Float.parseFloat(number2); }else if(operation.equals("-")){ result = Float.parseFloat(number1)-Float.parseFloat(number2); }else if(operation.equals("×")){ result = Float.parseFloat(number1)*Float.parseFloat(number2); }else if(operation.equals("/")){ result = Float.parseFloat(number1)/Float.parseFloat(number2); } editText.setText(String.valueOf(result)); } }); final Button minus = (Button) findViewById(R.id.minus); minus.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { number1 = editText.getText().toString(); editText.append(minus.getText()); } }); final Button mul = (Button) findViewById(R.id.mul); mul.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { number1 = editText.getText().toString(); editText.append(mul.getText()); } }); final Button plus = (Button) findViewById(R.id.plus); plus.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //保存第一个操作数 number1 = editText.getText().toString(); editText.append(plus.getText()); } }); } }
问题补充:谢谢您的回答,这种写法可以避免创建过多的OnClickListener对象,并且不需要对每一个Button添加事件,不过我试了一下,还是需要重复写很多相似的代码(像FindViewById(),switch分支过多),感觉应该有更好的方式。另外,按照您的写法,代码无法工作,捕获不到点击事件。package com.wondershare.calculator; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Calculator extends Activity implements OnClickListener { // 操作数 private String number1 = null; private String number2 = null; // 屏幕按键 private Button digit0 = null; private Button digit1 = null; private Button digit2 = null; private Button digit3 = null; private Button digit4 = null; private Button digit5 = null; private Button digit6 = null; private Button digit7 = null; private Button digit8 = null; private Button digit9 = null; private Button clear = null; private Button plus = null; private Button minus = null; private Button mul = null; private Button div = null; private Button equal = null; private Button dot = null; //输入框 private EditText editText = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 初始化屏幕按键 digit0 = (Button) findViewById(R.id.digit0); digit1 = (Button) findViewById(R.id.digit1); digit2 = (Button) findViewById(R.id.digit2); digit3 = (Button) findViewById(R.id.digit3); digit4 = (Button) findViewById(R.id.digit4); digit5 = (Button) findViewById(R.id.digit5); digit6 = (Button) findViewById(R.id.digit6); digit7 = (Button) findViewById(R.id.digit7); digit8 = (Button) findViewById(R.id.digit8); digit9 = (Button) findViewById(R.id.digit9); clear = (Button) findViewById(R.id.del); plus = (Button) findViewById(R.id.plus); minus = (Button) findViewById(R.id.minus); mul = (Button) findViewById(R.id.mul); div = (Button) findViewById(R.id.div); equal = (Button) findViewById(R.id.equal); dot = (Button) findViewById(R.id.dot); //初始化文本框 editText = (EditText) findViewById(R.id.editText); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.digit0: // setTextValue(String.valueOf(R.id.digit0)); editText.setText("测试"); break; case R.id.digit1: setTextValue(String.valueOf(R.id.digit1)); break; case R.id.digit2: setTextValue(String.valueOf(R.id.digit2)); break; case R.id.digit3: setTextValue(String.valueOf(R.id.digit3)); break; case R.id.digit4: setTextValue(String.valueOf(R.id.digit4)); break; case R.id.digit5: setTextValue(String.valueOf(R.id.digit5)); break; case R.id.digit6: setTextValue(String.valueOf(R.id.digit6)); break; case R.id.digit7: setTextValue(String.valueOf(R.id.digit7)); break; case R.id.digit8: setTextValue(String.valueOf(R.id.digit8)); break; case R.id.digit9: setTextValue(String.valueOf(R.id.digit9)); break; case R.id.del: // setTextValue(String.valueOf(R.id.del)); break; case R.id.plus: setTextValue(String.valueOf(R.id.plus)); break; case R.id.minus: setTextValue(String.valueOf(R.id.minus)); break; case R.id.mul: setTextValue(String.valueOf(R.id.mul)); break; case R.id.div: setTextValue(String.valueOf(R.id.div)); break; case R.id.equal: break; case R.id.dot: setTextValue(String.valueOf(R.id.dot)); break; default: break; } } /** * 当按键按下时设置文本框的值 * @param str */ private void setTextValue(String str){ editText.append(str); } }
billyyuan 写道给个我的习惯。public class Calculator extends Activity implements OnClickListener { private String number1 = null; private String number2 = null; Button digit0; Button digit1; Button digit2; Button digit3; Button digit4; Button digit5; Button digit6; Button digit7; Button digit8; Button digit9; Button delete; EditText editText; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //initUI digit0 = (Button) findViewById(R.id.digit0); digit1 = (Button) findViewById(R.id.digit1); digit2 = (Button) findViewById(R.id.digit2); digit3 = (Button) findViewById(R.id.digit3); digit4 = (Button) findViewById(R.id.digit4); digit5 = (Button) findViewById(R.id.digit5); digit6 = (Button) findViewById(R.id.digit6); digit7 = (Button) findViewById(R.id.digit7); digit8 = (Button) findViewById(R.id.digit8); digit9 = (Button) findViewById(R.id.digit9); editText = (EditText)findViewById(R.id.editText); del = (Button) findViewById(R.id.del); @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ default: break; case R.id.plus: break;; case R.id.digit0: break; case R.id.digit1: break; case R.id.digit2: break; case R.id.digit3: break; case R.id.digit4: break; case R.id.digit5: break; case R.id.digit6: break; case R.id.digit7: break; case R.id.digit8: break; case R.id.digit9: break; .... } } }
问题补充:明白了,原来我只是实现了OnClickListener接口,但是按钮没有添加监听,貌似这是一个很低级的错误啊,呵呵!另外,关于计算器的实现,我是通过字符串处理来分别得到两个操作数的,而且为了响应按钮事件,每一个case的setText是不可避免的,不知你所说的代码控制要怎么弄。有没有更好的计算器实现方式嘞!?billyyuan 写道不好意思还有点没有加上
digit0.setOnClickListener(this); digit1.setOnClickListener(this); digit2.setOnClickListener(this); digit3.setOnClickListener(this); digit4.setOnClickListener(this); digit5.setOnClickListener(this); digit6.setOnClickListener(this); digit7.setOnClickListener(this); digit8.setOnClickListener(this);
你可以把他们放在一个方法里面
还有,那个setText你觉得有重复,那要你的代码控制啊。
有一些可以用
setTextValue(String.valueOf(view.getId()));
当然你也可以在switch之前用一个变量保存view.getId().
这样就不必重复的getId();
问题补充:谢谢了,学到不少东西!billyyuan 写道public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); switch(id){ default: break; case R.id.digit0: case R.id.digit1: case R.id.digit2: case R.id.digit3: case R.id.digit4: case R.id.digit5: case R.id.digit6: case R.id.digit7: case R.id.digit8: Button digit = (Button)findViewById(id); Toast.makeText(Calculator.this,digit.getText(), Toast.LENGTH_SHORT).show(); break; // .... } }
就是这个意思
2011年3月30日 11:42
3个答案 按时间排序 按投票排序
-
采纳的答案
public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); switch(id){ default: break; case R.id.digit0: case R.id.digit1: case R.id.digit2: case R.id.digit3: case R.id.digit4: case R.id.digit5: case R.id.digit6: case R.id.digit7: case R.id.digit8: Button digit = (Button)findViewById(id); Toast.makeText(Calculator.this,digit.getText(), Toast.LENGTH_SHORT).show(); break; // .... } }
就是这个意思2011年3月31日 09:21
-
不好意思还有点没有加上
digit0.setOnClickListener(this); digit1.setOnClickListener(this); digit2.setOnClickListener(this); digit3.setOnClickListener(this); digit4.setOnClickListener(this); digit5.setOnClickListener(this); digit6.setOnClickListener(this); digit7.setOnClickListener(this); digit8.setOnClickListener(this);
你可以把他们放在一个方法里面
还有,那个setText你觉得有重复,那要你的代码控制啊。
有一些可以用
setTextValue(String.valueOf(view.getId()));
当然你也可以在switch之前用一个变量保存view.getId().
这样就不必重复的getId();2011年3月30日 16:42
-
给个我的习惯。
public class Calculator extends Activity implements OnClickListener { private String number1 = null; private String number2 = null; Button digit0; Button digit1; Button digit2; Button digit3; Button digit4; Button digit5; Button digit6; Button digit7; Button digit8; Button digit9; Button delete; EditText editText; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //initUI digit0 = (Button) findViewById(R.id.digit0); digit1 = (Button) findViewById(R.id.digit1); digit2 = (Button) findViewById(R.id.digit2); digit3 = (Button) findViewById(R.id.digit3); digit4 = (Button) findViewById(R.id.digit4); digit5 = (Button) findViewById(R.id.digit5); digit6 = (Button) findViewById(R.id.digit6); digit7 = (Button) findViewById(R.id.digit7); digit8 = (Button) findViewById(R.id.digit8); digit9 = (Button) findViewById(R.id.digit9); editText = (EditText)findViewById(R.id.editText); del = (Button) findViewById(R.id.del); @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ default: break; case R.id.plus: break;; case R.id.digit0: break; case R.id.digit1: break; case R.id.digit2: break; case R.id.digit3: break; case R.id.digit4: break; case R.id.digit5: break; case R.id.digit6: break; case R.id.digit7: break; case R.id.digit8: break; case R.id.digit9: break; .... } } }
2011年3月30日 13:35
相关推荐
Android 简单代码实现的Android 计算器源码.zip
android 计算器开发源代码 包含计算器算法的实现,调试成功,计算器能进行复合运算,能计算含log,ln,sin,cos等的复合运算;文件建议为计算器android项目代码,可用编程工具导入后可调试可编辑;
本文实例为大家分享了Android实现计算器的具体代码,供大家参考,内含整个工程项目及源代码。可以直接使用Androidstudio等IDE打开。文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android 应用 学习Android时写的一个计算器代码 测试没什么问题
android简单计算器代码
基于android平台的计算器的实现,可以运行
一个简单的带有加减的用android studio制作的计算器,带有清除功能
android studio计算器实现代码
android初学者学习源代码,计算器源代码,初学者可以看看这个例子
简易的Android计算器简易的Android计算器
微信小程序 小工具类 简易计算器 (源代码+截图)微信小程序 小工具类 简易计算器 (源代码+截图)微信小程序 小工具类 简易计算器 (源代码+截图)微信小程序 小工具类 简易计算器 (源代码+截图)微信小程序 小...
一个简单的计算器C代码一个简单的计算器C代码一个简单的计算器C代码一个简单的计算器C代码一个简单的计算器C代码一个简单的计算器C代码一个简单的计算器C代码
Android 简单代码实现的Android 计算器源码.rar
使用android eclipse 写的一个简易计算器
一个计算器源代码app,适合初学者学习参考,亲测可用。利用GridView布局实现,代码结构清晰有注释易于理解。
android简易计算器 计算器 android计算器 1.符合逻辑运算规则 2.处理重复按符号键出现的异常 3.显示公式 4.按个删除功能
一个简单代码实现的Android 计算器,代码量100行左右,可以学习到字符读取及UI。
写了一个普通计算器的代码 android中的必修课