Android系列案例2:android开发简易计算器

阶段1:进行计算器的界面布局View,activity_main.xml文件如下:

<!--fill_parent与match_parent的区别-->
<!--最外层布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
 >
<!--内层布局1-->
<!-- android:layout_weight属性按比例分配各个组件-->
<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
<EditText android:id="@+id/num1" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:inputType="numberDecimal"
    /> 
<TextView android:id="@+id/op" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:gravity="center"
    android:text="@string/op"
    />  
<EditText android:id="@+id/num2" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:inputType="numberDecimal"
    /> 
<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:text="="
    />    
<TextView 
    android:id="@+id/result"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    />     
</LinearLayout>
<!--内层布局2-->
<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
<Button android:id="@+id/add" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:text="+"
    /> 
    <Button android:id="@+id/sub" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:text="-"
    /> 
    <Button android:id="@+id/multiply" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:text="*"
    /> 
    <Button android:id="@+id/divide" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:text="/"
    /> 
</LinearLayout>
</LinearLayout>

阶段2:编写计算器的业务逻辑类Model:CalculatorBiz

/**
 * 模型层M:运算器业务逻辑类
 * @author jg
 */
public class CalculatorBiz {
	public double add(double num1, double num2) {
		return num1 + num2;
	}

	public double sub(double num1, double num2) {
		return num1 - num2;
	}

	public double mulitply(double num1, double num2) {
		return num1 * num2;
	}

	public double divide(double num1, double num2) {
		return num1 / num2;
	}
}

 

阶段3:编写Activity,查找组件并进行事件处理

public class MainActivity extends Activity {
	private EditText num1Text;// 操作数1文本框
	private EditText num2Text;// 操作数2文本框
	private TextView opText;// 运算符组件
	private TextView result;// 存放结果的组件
	private Button add;// 加法按钮组件
	private Button sub;// 减法按钮组件
	private Button multiply;// 乘法按钮组件
	private Button divide;// 除法按钮组件

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initialComponent();
		registerListener();

	}

	/**
	 * 自定义初始化组件的方法
	 */
	private void initialComponent() {
		num1Text = (EditText) this.findViewById(R.id.num1);
		num2Text = (EditText) this.findViewById(R.id.num2);
		opText = (TextView) this.findViewById(R.id.op);
		result = (TextView) this.findViewById(R.id.result);
		add = (Button) this.findViewById(R.id.add);
		sub = (Button) this.findViewById(R.id.sub);
		multiply = (Button) this.findViewById(R.id.multiply);
		divide = (Button) this.findViewById(R.id.divide);
	}

	/**
	 * 注册事件监听器
	 */
	private void registerListener() {
		add.setOnClickListener(new ButtonHandler());
		sub.setOnClickListener(new ButtonHandler());
		multiply.setOnClickListener(new ButtonHandler());
		divide.setOnClickListener(new ButtonHandler());
	}

	/**
	 * 定义事件处理类
	 */
	private class ButtonHandler implements OnClickListener {

		@Override
		public void onClick(View v) {
			String num1String = num1Text.getText().toString();
			String num2String = num2Text.getText().toString();
			CalculatorBiz calculatorBiz = new CalculatorBiz();
			// 判断究竟是点击了哪个按钮
			switch (v.getId()) {
			case R.id.add:
				opText.setText("+");
				result.setText(""
						+ format(calculatorBiz.add(
								Double.parseDouble(num1String),
								Double.parseDouble(num2String))));
				break;
			case R.id.sub:
				opText.setText("-");
				result.setText(""
						+ format(calculatorBiz.sub(
								Double.parseDouble(num1String),
								Double.parseDouble(num2String))));
				break;
			case R.id.multiply:
				opText.setText("*");
				result.setText(""
						+ format(calculatorBiz.mulitply(
								Double.parseDouble(num1String),
								Double.parseDouble(num2String))));
				break;
			case R.id.divide:
				if ("0".trim().equals(num2String)) {
					result.setText("");
					Toast.makeText(MainActivity.this, "除数不能为0",
							Toast.LENGTH_LONG).show();
					break;
				}
				opText.setText("/");
				result.setText(""
						+ format(calculatorBiz.divide(
								Double.parseDouble(num1String),
								Double.parseDouble(num2String))));
				break;
			default:
				break;
			}

		}

	}

	/**
	 * 
	 * @param result
	 * @return 格式化后的字符串
	 */
	private String format(double result) {
		DecimalFormat df = new DecimalFormat("0.00");
		return "" + df.format(result);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

 

阶段4:给计算器添加Menu,当点击菜单按钮式会弹出菜单选项

方式1:通过XML布局来实现

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/about"
        android:title="@string/about"
        android:icon="@android:drawable/ic_menu_help"
        />
    <item 
        android:id="@+id/exit"
        android:title="@string/exit"
        android:icon="@android:drawable/ic_menu_delete"
        />
</menu>


在Activity中需要重写如下方法:

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}


方式2:手动创建菜单

         @Override
	public boolean onCreateOptionsMenu(Menu menu) {
		/*
		 * getMenuInflater().inflate(R.menu.activity_main, menu); return true;
		 */
		menu.add(0, 0, 0, R.string.about);
                  // 第一个参数为组号,便于对整个组进行操作;第二个参数为菜单的ID,为了标识菜单项;第三个参数为显示顺序
		menu.add(0, 1, 1, R.string.exit);
		return true;
	}

groupId的用处:

menu.removeGroup(group1); //删除一组菜单
menu.setGroupVisible(gourp2, visible); //设置一组菜单是否可见
menu.setGroupEnabled(gourp2, enabled); //设置一组菜单是否可点

对菜单点击事件进行事件处理

        /**
	 * 当点击菜单项时调用此方法
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int itemId=item.getItemId();//获取菜单项的唯一编号
		switch (itemId) {
		case MENU_ABOUT:
			AlertDialog.Builder alertDialog=new AlertDialog.Builder(this);
			alertDialog.setIcon(android.R.drawable.ic_menu_help);//引用系统自带的图标
			alertDialog.setTitle(R.string.about);//给对话框设置标题
			alertDialog.setMessage(R.string.info);//设置对话框的提示信息
			alertDialog.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					Toast.makeText(MainActivity.this, "欢迎你的使用", Toast.LENGTH_LONG).show();
				}
			});
			alertDialog.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
				}
			});
			alertDialog.create().show();
			break;
		case MENU_EXIT:
			this.finish();//退出应用程序
		default:
			break;
		}
		return true;
	}

运行效果如下图所示:

 


 other:引用android自带的图标库见

http://www.cnblogs.com/qingblog/archive/2012/06/08/2541555.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值