文章目录
题目
设计一个计算器。要求布局美观,能实现手机计算器的基本功能。使用style统一设置控件的外观。
参考学习
扣了按键响应函数:用Android Studio编写简单的计算器,并实现具体功能
代码
Activity的java文件MainActivity.java
package com.example.wangyifan.calculator;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
public final static String EXTRA_MESSAGE = "it.uibe.edu.cn.myapplication.MESSAGE";
private TextView txt; /*显示计算过程及结果*/
private Button butp, but1, but2, but3, but4, but5, but6, but7, but8, but9, but0, buta, buts, butm, butdiv, butdopt, buteq;
double num1 = 0, num2 = 0;
double result = 0; /*计算结果*/
int op = 0; /*判断操作数*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txt = (TextView) findViewById(R.id.textView); /*与用户界面程序中组件建立关联*/
butp = (Button) findViewById(R.id.butCancel); /*清除*/
but1 = (Button) findViewById(R.id.but_1);
but2 = (Button) findViewById(R.id.but_2);
but3 = (Button) findViewById(R.id.but_3);
but4 = (Button) findViewById(R.id.but_4);
but5 = (Button) findViewById(R.id.but_5);
but6 = (Button) findViewById(R.id.but_6);
but7 = (Button) findViewById(R.id.but_7);
but8 = (Button) findViewById(R.id.but_8);
but9 = (Button) findViewById(R.id.but_9);
but0 = (Button) findViewById(R.id.but_0);
buta = (Button) findViewById(R.id.but_add); /*加*/
buts = (Button) findViewById(R.id.but_sub); /*减*/
butm = (Button) findViewById(R.id.but_mut); /*乘*/
butdiv = (Button) findViewById(R.id.but_div); /*除*/
butdopt = (Button) findViewById(R.id.but_dopt); /*点*/
buteq = (Button) findViewById(R.id.but_equ); /*等于*/
butp.setOnClickListener(new mClick());
but1.setOnClickListener(new mClick());
but2.setOnClickListener(new mClick());
but3.setOnClickListener(new mClick());
but4.setOnClickListener(new mClick());
but5.setOnClickListener(new mClick());
but6.setOnClickListener(new mClick());
but7.setOnClickListener(new mClick());
but8.setOnClickListener(new mClick());
but9.setOnClickListener(new mClick());
but0.setOnClickListener(new mClick());
buta.setOnClickListener(new mClick());
buts.setOnClickListener(new mClick());
butm.setOnClickListener(new mClick());
butdiv.setOnClickListener(new mClick());
butdopt.setOnClickListener(new mClick());
buteq.setOnClickListener(new mClick());
}
class mClick implements View.OnClickListener {
public void onClick(View v) {
switch (v.getId()) { /*用swtich()方法,判断点击按钮的id*/
case R.id.butCancel: /*清除,直接将输入的所有符号清空*/
txt.setText(null);
break;
/*数字,小数点按键*/
case R.id.but_1:
String str1 = txt.getText().toString(); /*获取输入内容并转为string类型/
str1+="1"; /*拼接字符串*/
txt.setText(str1); /*显示输入内容*/
break;
case R.id.but_2:
String str2 = txt.getText().toString();
str2 += "2";
txt.setText(str2);
break;
case R.id.but_3:
String str3 = txt.getText().toString();
str3 += "3";
txt.setText(str3);
break;
case R.id.but_4:
String str4 = txt.getText().toString();
str4 += "4";
txt.setText(str4);
break;
case R.id.but_5:
String str5 = txt.getText().toString();
str5 += "5";
txt.setText(str5);
break;
case R.id.but_6:
String str6 = txt.getText().toString();
str6 += "6";
txt.setText(str6);
break;
case R.id.but_7:
String str7 = txt.getText().toString();
str7 += "7";
txt.setText(str7);
break;
case R.id.but_8:
String str8 = txt.getText().toString();
str8 += "8";
txt.setText(str8);
break;
case R.id.but_9:
String str9 = txt.getText().toString();
str9 += "9";
txt.setText(str9);
break;
case R.id.but_0:
String strr = txt.getText().toString();
strr += "0";
txt.setText(strr);
break;
case R.id.but_dopt:
String strd = txt.getText().toString();
strd += ".";
txt.setText(strd);
break;
/*运算符按键*/
case R.id.but_add:
String stradd = txt.getText().toString();/*按运算符,获取要计算的数字,并放入num1等待计算*/
if (stradd.equals(null)) /*判断按运算符前是否输入要计算的数字,若为空,则返回*/ {
return;
}
num1 = Double.valueOf(stradd);/*将获取的字符串转化为double类型以便计算*/
txt.setText(null);
op = 1;
break;
case R.id.but_sub:
String strsub = txt.getText().toString();
if (strsub.equals(null)) {
return;
}
num1 = Double.valueOf(strsub);
txt.setText(null);
op = 2;
break;
case R.id.but_mut:
String strmut = txt.getText().toString();
if (strmut.equals(null)) {
return;
}
num1 = Double.valueOf(strmut);
txt.setText(null);
op = 3;
break;
case R.id.but_div:
String strdiv = txt.getText().toString();
if (strdiv.equals(null)) {
return;
}
num1 = Double.valueOf(strdiv);
txt.setText(null);
op = 4;
break;
case R.id.but_equ:
String strequ = txt.getText().toString();
num2 = Double.valueOf(strequ);
txt.setText(null);
switch (op) { /*用switch函数来判断进行何种操作,实施运算并得出结果*/
case 1:
result = num1 + num2;
txt.setText(String.valueOf(num1) + "+" + String.valueOf(num2) + "=" + String.valueOf(result));/*获取结果并将其转为字符串输出*/
break;
case 2:
result = num1 - num2;
txt.setText(String.valueOf(num1) + "-" + String.valueOf(num2) + "=" + String.valueOf(result));
break;
case 3:
result = num1 * num2;
txt.setText(String.valueOf(num1) + "*" + String.valueOf(num2) + "=" + String.valueOf(result));
break;
case 4:
if (num2 == 0) {
txt.setText("除数不能为0!"); /*规定除数不能为0,否则报错*/
} else {
result = num1 / num2;
txt.setText(String.valueOf(num1) + "/" + String.valueOf(num2) + "=" + String.valueOf(result));
}
break;
default:
result = 0;
break;
}
}
}
}
}
布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.wangyifan.calculator.MainActivity">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/mGray"
android:id="@+id/view"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="103dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textSize="45sp"
android:hint="0"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_alignBottom="@+id/view"
android:layout_alignStart="@+id/view" />
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="368dp"
android:layout_height="479dp"
android:layout_marginStart="4dp"
android:layout_marginTop="148dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/butCancel"
style="@style/MyButton.Operator.Clear_Del"
android:layout_width="wrap_content"
android:layout_weight="1"
android:text="C" />
<Button
android:id="@+id/but_div"
style="@style/MyButton.Operator"
android:text="÷" />
<Button
android:id="@+id/but_mut"
style="@style/MyButton.Operator"
android:text="×" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/but_7"
style="@style/MyButton.Digital"
android:layout_weight="1"
android:text="7" />
<Button
android:id="@+id/but_8"
style="@style/MyButton.Digital"
android:layout_weight="1"
android:text="8" />
<Button
android:id="@+id/but_9"
style="@style/MyButton.Digital"
android:layout_weight="1"
android:text="9" />
<Button
android:id="@+id/but_sub"
style="@style/MyButton.Operator"
android:layout_weight="1"
android:text="-" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/but_4"
style="@style/MyButton.Digital"
android:layout_weight="1"
android:text="4" />
<Button
android:id="@+id/but_5"
style="@style/MyButton.Digital"
android:layout_weight="1"
android:text="5" />
<Button
android:id="@+id/but_6"
style="@style/MyButton.Digital"
android:layout_weight="1"
android:text="6" />
<Button
android:id="@+id/but_add"
style="@style/MyButton.Operator"
android:layout_weight="1"
android:text="+" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/but_1"
style="@style/MyButton.Digital"
android:layout_weight="2"
android:text="1" />
<Button
android:id="@+id/but_2"
style="@style/MyButton.Digital"
android:layout_weight="2"
android:text="2" />
<Button
android:id="@+id/but_3"
style="@style/MyButton.Digital"
android:layout_weight="2"
android:text="3" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/but_0"
style="@style/MyButton.Digital.Zero"
android:layout_weight="2"
android:text="0" />
<Button
android:id="@+id/but_dopt"
style="@style/MyButton.Digital.Zero"
android:layout_weight="1"
android:text="." />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<Button
android:id="@+id/but_equ"
style="@style/MyButton.Operator"
android:layout_weight="1"
android:text="=" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
设置style的xml文件calculatorstyle.xml
这个文件在res/values下新建。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Base application theme. -->
<style name="ResultView" parent="@android:style/TextAppearance.Medium">
<!-- Customize your theme here. -->
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@color/mLight</item>
<item name="android:textColor">@color/mBlue</item>
<item name="android:gravity">right|bottom</item>
<item name="android:paddingBottom">5dp</item>
<item name="android:paddingRight">20dp</item>
<item name="android:textSize">50sp</item>
<item name="android:layout_weight">1</item>
</style>
<style name="MyButton" parent="android:MediaButton">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:gravity">center</item>
<item name="android:textSize">30sp</item>
<item name="android:layout_margin">2dp</item>
<item name="android:background">@drawable/caculator_shape</item>
<!-- <item name="android:layout_weight">1</item>-->
<!-- <item name="android:background">@color/mWhite</item>-->
</style>
<style name="MyButton.Digital">
<item name="android:textColor">#000000</item>
</style>
<style name="MyButton.Operator">
<item name="android:textColor">@color/mBlue</item>
</style>
<style name="MyButton.Operator.Clear_Del">
<item name="android:textColor">@color/mOrange</item>
</style>
<style name="MyButton.Digital.Zero">
<item name="android:layout_width">0dp</item>
</style>
</resources>
设置color的xml文件caculator_shape.xml
这个新建在res/drawable
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="20dp"/>
<gradient
android:startColor="@color/mBlue"
android:endColor="@color/mLight"
android:angle="45" />
</shape>