0 0

简单写了一个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个答案 按时间排序 按投票排序

0 0

采纳的答案

    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
0 0

不好意思还有点没有加上

       

        
        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
0 0

给个我的习惯。

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

相关推荐

Global site tag (gtag.js) - Google Analytics