目标效果:
通过编写代码,可以实现整数和小数的加减乘除运算,以及删除和清空的功能。
1.页面中Button使用的是线性布局,最外边一个是父布局,第一行C,DEL,/,*为第一个子布局,第二行7,8,9,-为第二个子布局,第三行4,5,6,+为第三个子布局,第四五行为第四个子布局,第四个子布局中还有两个相当于是孙布局的级别,1,2,3为第一个孙布局,0和.为第二个孙布局,=在两个孙布局之外第四个子布局以内。因为计算器的水平竖直排列十分鲜明,所以可以用线性布局,当然也可以用表格布局来进行排布。
2.activity_main.xml页面用于存放所有控件。
activity_main.xml页面:
<LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_marginTop="40dp"android:layout_height="fill_parent"android:orientation="vertical" ><EditTextandroid:id="@+id/etInput"android:layout_width="310dp"android:layout_height="60dip"android:editable="false" //代表不能进行键盘输入android:gravity="right"//文字靠右边android:layout_gravity="center"android:background="@drawable/white_bg"/> <!-- 设置输入框的背景,为一个xml文件 --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:gravity="center_horizontal"android:orientation="horizontal" ><!-- 代表水平排布 --><Buttonandroid:id="@+id/btClear"android:background="@drawable/white_select" //设置按钮的背景,为一个xml文件android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="C" /><Buttonandroid:id="@+id/btDel"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="DEL" /><Buttonandroid:id="@+id/btDivide"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="/" /><Buttonandroid:id="@+id/btMul"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="*" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:gravity="center_horizontal"android:orientation="horizontal" ><Buttonandroid:id="@+id/btSeven"android:background="@drawable/white_select"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="7" /><Buttonandroid:id="@+id/btEight"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="8" /><Buttonandroid:id="@+id/btNine"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="9" /><Buttonandroid:id="@+id/btJian"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="-" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:gravity="center_horizontal"android:orientation="horizontal" ><Buttonandroid:id="@+id/btFour"android:background="@drawable/white_select"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="4" /><Buttonandroid:id="@+id/btFive"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="5" /><Buttonandroid:id="@+id/btSix"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="6" /><Buttonandroid:id="@+id/btJia"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="+" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:gravity="center_horizontal"android:orientation="horizontal" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical" > <LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><Buttonandroid:id="@+id/btOne"android:background="@drawable/white_select"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="1" /><Buttonandroid:id="@+id/btTwo"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="2" /><Buttonandroid:id="@+id/btThree"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="3" /> </LinearLayout> <LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:orientation="horizontal" ><Buttonandroid:id="@+id/btZero"android:background="@drawable/white_select"android:layout_width="155dp"android:layout_height="60dp"android:textSize="20sp"android:text="0" /><Buttonandroid:id="@+id/btPoint"android:background="@drawable/white_select"android:layout_marginLeft="5dp"android:layout_width="75dp"android:layout_height="60dp"android:textSize="20sp"android:text="." /></LinearLayout> </LinearLayout> <Buttonandroid:layout_width="75dp" android:background="@drawable/orange_select"android:layout_height="125dp"android:text="="android:layout_marginLeft="5dp"android:textSize="20sp"android:gravity="center"android:id="@+id/btEqu"> </Button></LinearLayout></LinearLayout>
2.等号按钮和其余按钮的背景及点击效果不同。orange_select.xml页面是等号按钮的背景页面。 orange_select.xml页面:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android" ><item android:drawable="@drawable/orange_bg" android:state_pressed="false"></item> <!-- 不点击时背景为orange_bg.xml页面的效果 --><item android:drawable="@drawable/khaki_bg" android:state_pressed="true"></item> <!-- 点击时背景为khaki_bg.xml页面的效果 --></selector>
3.orange_bg.xml页面:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android" ><corners android:radius="5dp"/><solid android:color="#ff9900"/></shape>
4.khaki.xml页面:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android" ><corners android:radius="5dp"/><solid android:color="#cc6600"/></shape>
5.white_select.xml页面是其余按钮的背景页面。 white_select页面:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android" ><item android:drawable="@drawable/white_bg" android:state_pressed="false"></item><item android:drawable="@drawable/gray_bg" android:state_pressed="true"></item></selector>
6.white_bg.xml页面:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android" ><corners android:radius="5dp"/><solid android:color="#ffffff"/></shape>
7.gray_bg.xml页面:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android" ><corners android:radius="5dp"/><solid android:color="#cccccc"/></shape>
8.MainActivity.java处理按钮的点击事件以及数值运算。 MainActivity.java页面:
package com.example.jisuanqi;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends Activity implements OnClickListener{private EditText etInput;//实例输入框private Button btOne; //实例所有按钮private Button btTwo;private Button btThree;private Button btFour;private Button btFive;private Button btSix;private Button btSeven;private Button btEight;private Button btNine;private Button btZero;private Button btPoint;private Button btJia;private Button btJian;private Button btMul;private Button btDivide;private Button btEqu;private Button btClear;private Button btDel;boolean clear_flag; //清空标识,当用户点击等号完成一次运算时进行清空@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etInput=(EditText) findViewById(R.id.etInput);//获取输入框的idbtOne=(Button) findViewById(R.id.btOne); //获取所有按钮的idbtTwo=(Button) findViewById(R.id.btTwo);btThree=(Button) findViewById(R.id.btThree);btFour=(Button) findViewById(R.id.btFour);btFive=(Button) findViewById(R.id.btFive);btSix=(Button) findViewById(R.id.btSix);btSeven=(Button) findViewById(R.id.btSeven);btEight=(Button) findViewById(R.id.btEight);btNine=(Button) findViewById(R.id.btNine);btZero=(Button) findViewById(R.id.btZero);btPoint=(Button) findViewById(R.id.btPoint);btJia=(Button) findViewById(R.id.btJia);btJian=(Button) findViewById(R.id.btJian);btMul=(Button) findViewById(R.id.btMul);btDivide=(Button) findViewById(R.id.btDivide);btEqu=(Button) findViewById(R.id.btEqu);btClear=(Button) findViewById(R.id.btClear);btDel=(Button) findViewById(R.id.btDel);btOne.setOnClickListener(this);//设置点击事件,因为MainActivity已经实现了OnClickListener接口,所以只需要参数只需要传thisbtTwo.setOnClickListener(this);btThree.setOnClickListener(this);btFour.setOnClickListener(this);btFive.setOnClickListener(this);btSix.setOnClickListener(this);btSeven.setOnClickListener(this);btEight.setOnClickListener(this);btNine.setOnClickListener(this);btZero.setOnClickListener(this);btPoint.setOnClickListener(this);btJia.setOnClickListener(this);btJian.setOnClickListener(this);btMul.setOnClickListener(this);btDivide.setOnClickListener(this);btEqu.setOnClickListener(this);btClear.setOnClickListener(this);btDel.setOnClickListener(this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString etinput=etInput.getText().toString(); //获取输入框中的内容并转化为String类型switch(v.getId()){//判断点击按钮的idcase R.id.btZero:case R.id.btOne:case R.id.btTwo:case R.id.btThree:case R.id.btFour:case R.id.btFive:case R.id.btSix:case R.id.btSeven:case R.id.btEight:case R.id.btNine:case R.id.btPoint:if(clear_flag){clear_flag=false;etinput="";etInput.setText("");}etInput.setText(etinput+((Button)v).getText()); //点击数字和小数点直接显示内容break;case R.id.btJia:case R.id.btJian:case R.id.btMul:case R.id.btDivide:if(clear_flag){clear_flag=false;etinput="";etInput.setText(""); //当clear_flag为true时进入if语句,并可以清空,代表用户点击了等于号完成一次运算,并使clear_flag变成了true}etInput.setText(etinput+" "+((Button)v).getText()+" "); //点击运算符也是直接显示,但是为了后边运算要在运算符两侧加上空格break;case R.id.btDel:if(clear_flag){clear_flag=false;etinput="";etInput.setText("");}else if(etinput!=null&&!etinput.equals("")){etInput.setText(etinput.substring(0,etinput.length()-1)); //如果输入框内容不为空,则去掉最后一位}break;case R.id.btClear:clear_flag=false;etinput="";etInput.setText(""); //直接设置输入框为空break;case R.id.btEqu:getResult(); //点击等号调用getResult()方法break;}}public void getResult(){String exp=etInput.getText().toString(); //获取输入框的内容if(exp==null||exp.equals("")){return;}if(!exp.contains(" ")){ //判断输入框是否包含空格,也就是没有点击运算符return;}if(clear_flag){ //点击等号clear_flag为true,当再点击别的数字或运算符时才会变为false,如果连续点击等号,则第二次点击无效,直接返回clear_flag=false;return;}clear_flag=true;double result=0;String s1=exp.substring(0,exp.indexOf(" ")); //运算符前面的字符串String op=exp.substring(exp.indexOf(" ")+1,exp.indexOf(" ")+2); //运算符,是根据运算符前边的空格计算的String s2=exp.substring(exp.indexOf(" ")+3); //运算符后边的字符串if(!s1.equals("")&&!s2.equals("")){double d1=Double.parseDouble(s1); //将字符串转换为double类型double d2=Double.parseDouble(s2);if(op.equals("+")){result=d1+d2;}else if(op.equals("-")){result=d1-d2;}else if(op.equals("*")){result=d1*d2;}else if(op.equals("/")){if(d2==0){//判断除数为0的情况result=0;}else{result=d1/d2;}}if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("/")){ //如果两个数都是整形,那么结果就需要显示为整数int r=(int)result; //将String型计算结果强制转换为整形etInput.setText(r+"");}else{etInput.setText(result+"");}}else if(!s1.equals("")&&s2.equals("")){ //如果用户输入一个数字就点击运算符,那么将不计算etInput.setText(exp);}else if(s1.equals("")&&!s2.equals("")){ //如果一上来就点击运算符并输入第二个数,那么第一个数默认为0double d2=Double.parseDouble(s2);if(op.equals("+")){result=0+d2;}else if(op.equals("-")){result=0-d2;}else if(op.equals("*")){result=0;}else if(op.equals("/")){result=0;}if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("/")){int r=(int)result;etInput.setText(r+"");}else{etInput.setText(result+"");}}else{etInput.setText("");}}}
9.程序完成就可以运行了。因为是简易计算器,所以还不能进行连续的加减乘除。