阶段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