android开发-安卓计算器
第一次弄安卓开发,有点坎坷,不过还好,经过两天的努力还是能完成。
首先在res/layout的文件夹下配置activity_main.xml文件
这是一个安卓页面文件,有关界面的控件都是在这里定义,例如在里面写一段内容:
<TableRow> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="42sp" android:layout_weight="1"> <Button android:id="@+id/opLEFT" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="(" android:layout_weight="1" /> <Button android:id="@+id/opRIGHT" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text=")" android:layout_weight="1" /> <Button android:id="@+id/opDEL" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="DEL" android:layout_weight="1" /> <Button android:id="@+id/opCLS" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="CLS" android:layout_weight="1" /> </LinearLayout> </TableRow>
上面的 <TableRow></TableRow>是一行,和网页标签<tr></tr>类似
在<LineraLayout>标签是在这行里加入一个线性布局,里面有一些对该布局属性的定义。
<Button>标签是添加一个按钮,id=@+id/opLEFT给该按钮定义一个名字,方便在后台对其的调用,text="("是其显示的内容,即该按钮是一个左括号按键。
以下各个按钮类似,这里不再赘述。
至此运行文件就可以在界面上显示一组按钮了,虽然什么功能都没有,下面将介绍如何在后台添加功能。
以左括号按钮为例
在MainActivity.java 的onCreate()函数里
我们定义一个Button 如Button btn=new Button()
然后指定其对应于界面上的按钮,btn=(Button)findViewById(R.id.opLEFT);
注意opLEFT是我们在XML文件中定义的名称,在此可以用上。
至此我们就可以通过操作btn来控制左括号实行的功能了。
既然要实现功能,就必须得对其添加一个事件监听器
我们自己实现一个监听函数:
private class clickNumListener implements Button.OnClickListener{ @Override public void onClick(View view) { Button btn = (Button)view; String input = btn.getText().toString(); resultText.append(input); } }
然后给其加上监听器:btn.setOnClickListener(new clickNumListener());
实现的功能是给resultText的内容添加上'(',resultText是一个文本框,其定义方式和btn类似.
到此,基本显示到点击触发功能已经实现,剩下的内容就是如何实现了,这里不进行详细说明,给代码大家自己琢磨
MainActivity.java
package example.mypro; import java.util.Stack; import android.R.string; import android.support.v7.app.ActionBarActivity; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends ActionBarActivity { private Button[] btnNum = new Button[15]; private Button[] btnOp = new Button[11]; private EditText resultText=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnNum[0] = (Button) findViewById(R.id.num0); btnNum[1] = (Button) findViewById(R.id.num1); btnNum[2] = (Button) findViewById(R.id.num2); btnNum[3] = (Button) findViewById(R.id.num3); btnNum[4] = (Button) findViewById(R.id.num4); btnNum[5] = (Button) findViewById(R.id.num5); btnNum[6] = (Button) findViewById(R.id.num6); btnNum[7] = (Button) findViewById(R.id.num7); btnNum[8] = (Button) findViewById(R.id.num8); btnNum[9] = (Button) findViewById(R.id.num9); btnNum[10] = (Button) findViewById(R.id.opLEFT); btnNum[11] = (Button) findViewById(R.id.opRIGHT); btnNum[12] = (Button) findViewById(R.id.opPOI); btnOp[1]=(Button) findViewById(R.id.opADD); btnOp[2]=(Button) findViewById(R.id.opSUB); btnOp[3]=(Button) findViewById(R.id.opDIV); btnOp[4]=(Button) findViewById(R.id.opMUL); btnOp[5]=(Button) findViewById(R.id.opEQU); btnOp[6]=(Button) findViewById(R.id.opDEL); btnOp[7]=(Button) findViewById(R.id.opCLS); resultText=(EditText) findViewById(R.id.result); for(int i=0;i<=12;i++) btnNum[i].setOnClickListener(new clickNumListener()); for(int i=1;i<=4;i++) btnOp[i].setOnClickListener(new clickNumListener()); btnOp[5].setOnClickListener(new clickOpListener()); btnOp[6].setOnClickListener(new clickOpListener()); btnOp[7].setOnClickListener(new clickOpListener()); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } private class clickNumListener implements Button.OnClickListener{ @Override public void onClick(View view) { Button btn = (Button)view; String input = btn.getText().toString(); resultText.append(input); } } private class clickOpListener implements Button.OnClickListener{ @Override public void onClick(View view) { Button btn = (Button)view; String input = btn.getText().toString(); if(input.equals("=")) { calculate(); } else if(input.equals("DEL")) { if(resultText.getText().length()>0) resultText.setText(resultText.getText().subSequence(0, resultText.getText().length()-1)); } else if(input.equals("CLS")) { resultText.setText(""); } } } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. switch(item.getItemId()) { case R.id.mi1: break; case R.id.mi2: break; case R.id.mi3: break; case R.id.mi4: break; } return true ; } public void calculate() { char[] str=new char[100]; resultText.append("#"); Stack<String> s=new Stack<String>(); Stack<String> s2=new Stack<String>(); s.push("#"); int len1=0; int count=999; boolean flag=true; for(int i=0;i<resultText.getText().length();i++) { try { if((resultText.getText().charAt(i)<='9'&&resultText.getText().charAt(i)>='0')||resultText.getText().charAt(i)=='.') { count=0; str[len1++]=resultText.getText().charAt(i); } else if(resultText.getText().charAt(i)!=')'&&resultText.getText().charAt(i)!='#') { count++; if(count==1) { s2.push(String.valueOf(str)); len1=0; str=new char[100]; } if(s.size()==1||resultText.getText().charAt(i)=='('||s.peek().charAt(0)=='(') s.push(String.valueOf(resultText.getText().charAt(i))); else if(resultText.getText().charAt(i)=='x'||resultText.getText().charAt(i)=='/') { if(s.peek().charAt(0)=='x'||s.peek().charAt(0)=='/') { char c=s.pop().charAt(0); String num1=s2.pop(); String num2=s2.pop(); double num3; if(c=='x') { num3=Double.parseDouble(num1)*Double.parseDouble(num2); s2.push(String.valueOf(num3)); } else { num3=Double.parseDouble(num2)/Double.parseDouble(num1); s2.push(String.valueOf(num3)); } s.push(String.valueOf(resultText.getText().charAt(i))); } else { s.push(String.valueOf(resultText.getText().charAt(i))); } } else if(resultText.getText().charAt(i)=='+'||resultText.getText().charAt(i)=='-') { char c=s.pop().charAt(0); String num1=s2.pop(); String num2=s2.pop(); double num3; if(c=='x') { num3=Double.parseDouble(num1)*Double.parseDouble(num2); s2.push(String.valueOf(num3)); } else if(c=='+') { num3=Double.parseDouble(num2)+Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else if(c=='-') { num3=Double.parseDouble(num2)-Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else { num3=Double.parseDouble(num2)/Double.parseDouble(num1); s2.push(String.valueOf(num3)); } s.push(String.valueOf(resultText.getText().charAt(i))); } } else { count++; if(count==1) { s2.push(String.valueOf(str)); len1=0; str=new char[100]; } if(resultText.getText().charAt(i)==')') { while(true) { char c=s.pop().charAt(0); if(c=='(') break; String num1=s2.pop(); String num2=s2.pop(); double num3; if(c=='+') { num3=Double.parseDouble(num2)+Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else if(c=='-') { num3=Double.parseDouble(num2)-Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else if(c=='x') { num3=Double.parseDouble(num2)*Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else if(c=='/') { num3=Double.parseDouble(num2)/Double.parseDouble(num1); s2.push(String.valueOf(num3)); } } } else { while(true) { char c=s.pop().charAt(0); if(c=='#') break; String num1=s2.pop(); String num2=s2.pop(); double num3; if(c=='+') { num3=Double.parseDouble(num2)+Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else if(c=='-') { num3=Double.parseDouble(num2)-Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else if(c=='x') { num3=Double.parseDouble(num2)*Double.parseDouble(num1); s2.push(String.valueOf(num3)); } else if(c=='/') { num3=Double.parseDouble(num2)/Double.parseDouble(num1); s2.push(String.valueOf(num3)); } } } } } catch(Exception e) { flag=false; resultText.setText("Error"); break; } } if(flag) resultText.setText(s2.pop()); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="42sp" android:stretchColumns="1"> <TableRow> <EditText android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:drawable/editbox_background" android:layout_span="4" android:textSize="30sp" android:gravity="right|center_vertical" android:cursorVisible="false" android:editable="false" android:lines="1" /> </TableRow> <TableRow> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="42sp" android:layout_weight="1"> <Button android:id="@+id/opLEFT" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="(" android:layout_weight="1" /> <Button android:id="@+id/opRIGHT" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text=")" android:layout_weight="1" /> <Button android:id="@+id/opDEL" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="DEL" android:layout_weight="1" /> <Button android:id="@+id/opCLS" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="CLS" android:layout_weight="1" /> </LinearLayout> </TableRow> <TableRow> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="42sp" android:layout_weight="1"> <Button android:id="@+id/num7" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="7" android:layout_weight="1" /> <Button android:id="@+id/num8" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="8" android:layout_weight="1" /> <Button android:id="@+id/num9" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="9" android:layout_weight="1" /> <Button android:id="@+id/opDIV" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="/" android:layout_weight="1" /> </LinearLayout> </TableRow> <TableRow> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="42sp" android:layout_weight="1"> <Button android:id="@+id/num4" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="4" android:layout_weight="1" /> <Button android:id="@+id/num5" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="5" android:layout_weight="1" /> <Button android:id="@+id/num6" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="6" android:layout_weight="1" /> <Button android:id="@+id/opMUL" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="x" android:layout_weight="1" /> </LinearLayout> </TableRow> <TableRow> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="42sp" android:layout_weight="1"> <Button android:id="@+id/num1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="1" android:layout_weight="1" /> <Button android:id="@+id/num2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="2" android:layout_weight="1" /> <Button android:id="@+id/num3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="3" android:layout_weight="1" /> <Button android:id="@+id/opSUB" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="-" android:layout_weight="1" /> </LinearLayout> </TableRow> <TableRow> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:layout_weight="1"> <Button android:id="@+id/opPOI" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="." android:layout_weight="1" /> <Button android:id="@+id/num0" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="0" android:layout_weight="1" /> <Button android:id="@+id/opEQU" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="=" android:layout_weight="1" /> <Button android:id="@+id/opADD" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="30sp" android:text="+" android:layout_weight="1" /> </LinearLayout> </TableRow> <TableRow> <TextView android:id="@+id/show" android:layout_width="fill_parent" android:text="本软件由韦忠汕,刘星星,王建雄联合打造" android:layout_height="wrap_content" android:gravity="center"/> </TableRow> </TableLayout>