实现计算器功能:
1.先导包 bsh-2.0b4.jar
2.布局文件:
通过TableLayout与TableRow实现布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.CalculatorActivity"
android:id="@+id/lay">
<EditText
android:layout_width="fill_parent"
android:layout_height="100dp"
android:textColor="#FFF"
android:textSize="20pt"
android:background="#000"
android:editable="false"
android:gravity="right|center_vertical"
android:id="@+id/rsText"
/>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.18"
>
<Button
android:id="@+id/left"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:paddingBottom="7dp"
android:text="("
/>
<Button
android:id="@+id/right"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:layout_marginLeft="1dp"
android:paddingBottom="7dp"
android:textColor="#FFF"
android:text=")"
/>
<Button
android:id="@+id/tonone"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:text="C"
/>
<Button
android:id="@+id/delete"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:textColor="#FFF"
android:textSize="8pt"
android:layout_marginLeft="1dp"
android:layout_marginBottom="1dp"
android:text="清除" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
>
<Button
android:id="@+id/num7"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="7" />
<Button
android:id="@+id/num8"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="8" />
<Button
android:id="@+id/num9"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="9" />
<Button
android:id="@+id/division"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="÷" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
>
<Button
android:id="@+id/num4"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="4" />
<Button
android:id="@+id/num5"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="5" />
<Button
android:id="@+id/num6"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="6" />
<Button
android:id="@+id/multiply"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="×" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
>
<Button
android:id="@+id/num1"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="1" />
<Button
android:id="@+id/num2"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="2" />
<Button
android:id="@+id/num3"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="3" />
<Button
android:id="@+id/minus"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="-" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.2"
>
<Button
android:id="@+id/dot"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="." />
<Button
android:id="@+id/num0"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/numclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="0" />
<Button
android:id="@+id/equ"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="=" />
<Button
android:id="@+id/plus"
android:layout_height="fill_parent"
android:layout_weight="0.25"
android:background="@drawable/funclk"
android:layout_marginLeft="1dp"
android:textColor="#FFF"
android:textSize="20pt"
android:layout_marginBottom="1dp"
android:text="+" />
</TableRow>
</TableLayout>
</LinearLayout>
3.代码中:
public class CalculatorActivity extends Activity implements OnClickListener {
EditText rsText = null; //显示器
boolean isClear = false; //用于记录依稀
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calculator);
//fun 功能按钮
rsText = (EditText)findViewById(R.id.rsText);
Button btnDel = (Button)findViewById(R.id.delete);
Button btnPlu = (Button)findViewById(R.id.plus);
Button btnMin = (Button)findViewById(R.id.minus);
Button btnMul = (Button)findViewById(R.id.multiply);
Button btnDiv = (Button)findViewById(R.id.division);
Button btnEqu = (Button)findViewById(R.id.equ);
Button btnTono = (Button)findViewById(R.id.tonone);
Button btnLeft = (Button)findViewById(R.id.left);
Button btnRight = (Button)findViewById(R.id.right);
//num 数字按钮
Button num0 = (Button)findViewById(R.id.num0);
Button num1 = (Button)findViewById(R.id.num1);
Button num2 = (Button)findViewById(R.id.num2);
Button num3 = (Button)findViewById(R.id.num3);
Button num4 = (Button)findViewById(R.id.num4);
Button num5 = (Button)findViewById(R.id.num5);
Button num6 = (Button)findViewById(R.id.num6);
Button num7 = (Button)findViewById(R.id.num7);
Button num8 = (Button)findViewById(R.id.num8);
Button num9 = (Button)findViewById(R.id.num9);
Button dot = (Button)findViewById(R.id.dot);
//listener
btnTono.setOnClickListener(this);
btnLeft.setOnClickListener(this);
btnRight.setOnClickListener(this);
btnDel.setOnClickListener(this);
btnPlu.setOnClickListener(this);
btnMin.setOnClickListener(this);
btnMul.setOnClickListener(this);
btnDiv.setOnClickListener(this);
btnEqu.setOnClickListener(this);
num0.setOnClickListener(this);
num1.setOnClickListener(this);
num2.setOnClickListener(this);
num3.setOnClickListener(this);
num4.setOnClickListener(this);
num5.setOnClickListener(this);
num6.setOnClickListener(this);
num7.setOnClickListener(this);
num8.setOnClickListener(this);
num9.setOnClickListener(this);
dot.setOnClickListener(this);
}
@Override
public void onClick(View e) {
Button btn = (Button)e;
String exp = rsText.getText().toString();
if(isClear &&(
btn.getText().equals("0")
||btn.getText().equals("1")
||btn.getText().equals("2")
||btn.getText().equals("3")
||btn.getText().equals("4")
||btn.getText().equals("5")
||btn.getText().equals("6")
||btn.getText().equals("7")
||btn.getText().equals("8")
||btn.getText().equals("9")
||btn.getText().equals("."))
||btn.getText().toString().equals("算数公式错误")){
rsText.setText("");
isClear = false;
}
if(btn.getText().equals("C")){
rsText.setText("");
}else if(btn.getText().equals("清除")){
if(exp==null || exp.trim().length()==0)
return;
else
rsText.setText(exp.substring(0, exp.length()-1));
}else if(btn.getText().equals("=")){
if(exp==null || exp.trim().length()==0)
return;
exp = exp.replaceAll("×", "*");
exp = exp.replaceAll("÷", "/");
exp = getRs(exp);
if(exp.endsWith(".0")){
exp = exp.substring(0, exp.indexOf(".0"));
}
rsText.setText(exp);
isClear = false;
}else{
rsText.setText(rsText.getText()+""+btn.getText());
isClear = false;
}
//按键完成后始终保持光标在最后一位
rsText.setSelection(rsText.getText().length());
}
/***
* @param exp 算数表达式
* @return 根据表达式返回结果
*/
private String getRs(String exp){
Interpreter bsh = new Interpreter();
Number result = null;
try {
exp = filterExp(exp);
result = (Number)bsh.eval(exp);
} catch (EvalError e) {
e.printStackTrace();
isClear = true;
return "算数公式错误";
}
return result.doubleValue()+"";
}
/**
* @param exp 算数表达式
* @return 因为计算过程中,全程需要有小数参与.
*/
private String filterExp(String exp) {
String num[] = exp.split("");
String temp = null;
int begin=0,end=0;
for (int i = 1; i < num.length; i++) {
temp = num[i];
if(temp.matches("[+-/()*]")){
if(temp.equals(".")) continue;
end = i - 1;
temp = exp.substring(begin, end);
if(temp.trim().length() > 0 && temp.indexOf(".")<0)
num[i-1] = num[i-1]+".0";
begin = end + 1;
}
}
return Arrays.toString(num).replaceAll("[\\[\\], ]", "");
}