1.项目基础目录
新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。
另外 themes.xml中原来的
<style name="Theme.Learn" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
变为了,加上后可针对button中增加图片和文字修改背景。
<style name="Theme.Learn" parent="Theme.MaterialComponents.DayNight.DarkActionBar.Bridge">
2. XML代码
UI效果
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#888888"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="@string/calTitle"
android:textColor="@color/black"
android:textSize="17sp" />
<TextView
android:id="@+id/tv_res"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="5dp"
android:layout_marginRight="8dp"
android:background="#FFFFFF"
android:gravity="right|bottom"
android:lines="3"
android:text="0"
android:textColor="@color/black"
android:textSize="25sp" />
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="4"
android:rowCount="5"
android:layout_marginTop="10dp">
<Button
android:id="@+id/btn_ce"
android:text="@string/CE"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_multi"
android:text="@string/multi"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_divide"
android:text="@string/divide"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_back"
android:text="@string/back"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_seven"
android:text="@string/seven"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_eight"
android:text="@string/eight"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_nine"
android:text="@string/nine"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_plus"
android:text="@string/plus"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_four"
android:text="@string/four"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_five"
android:text="@string/five"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_six"
android:text="@string/six"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_minus"
android:text="@string/minus"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_one"
android:text="@string/one"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_two"
android:text="@string/two"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_three"
android:text="@string/three"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<ImageButton
android:id="@+id/btn_radical"
android:src="@drawable/radical"
android:scaleType="centerInside"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
tools:ignore="TouchTargetSizeCheck,SpeakableTextPresentCheck"
/>
<Button
android:id="@+id/btn_fraction"
android:text="@string/fraction"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_zero"
android:text="@string/zero"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_point"
android:text="@string/point"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
<Button
android:id="@+id/btn_equal"
android:text="@string/equal"
android:layout_width="0dp"
android:layout_height="@dimen/btn_height"
android:layout_columnWeight="1"
android:gravity="center"
android:textSize="@dimen/btn_font_size"
android:textColor="@color/black"
/>
</GridLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
3.Java代码
package com.example.learn;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class CalActivity extends AppCompatActivity implements View.OnClickListener {
//运算符
private String operator = "";
//第一个操作数
private String firstNum = "";
//第二个操作数
private String secondNum = "";
//结果
private String result = "";
//显示的文本内容
private String showText = "";
//记录结果
private TextView tv_res;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cal);
//发现页面控件
tv_res = findViewById(R.id.tv_res);
//Button 组件
//1 运算符
findViewById(R.id.btn_back).setOnClickListener(this);
findViewById(R.id.btn_ce).setOnClickListener(this);
findViewById(R.id.btn_plus).setOnClickListener(this);
findViewById(R.id.btn_minus).setOnClickListener(this);
findViewById(R.id.btn_multi).setOnClickListener(this);
findViewById(R.id.btn_divide).setOnClickListener(this);
findViewById(R.id.btn_radical).setOnClickListener(this);
findViewById(R.id.btn_equal).setOnClickListener(this);
findViewById(R.id.btn_fraction).setOnClickListener(this);
findViewById(R.id.btn_point).setOnClickListener(this);
//2、数字
findViewById(R.id.btn_zero).setOnClickListener(this);
findViewById(R.id.btn_one).setOnClickListener(this);
findViewById(R.id.btn_two).setOnClickListener(this);
findViewById(R.id.btn_three).setOnClickListener(this);
findViewById(R.id.btn_four).setOnClickListener(this);
findViewById(R.id.btn_five).setOnClickListener(this);
findViewById(R.id.btn_six).setOnClickListener(this);
findViewById(R.id.btn_seven).setOnClickListener(this);
findViewById(R.id.btn_eight).setOnClickListener(this);
findViewById(R.id.btn_nine).setOnClickListener(this);
}
@Override
public void onClick(View view) {
String inputText = "";
//处理图片按钮
if (view.getId() == R.id.btn_radical) {
inputText = "#";
} else {
inputText = ((Button) view).getText().toString();
}
switch (view.getId()) {
//清空按钮
case R.id.btn_ce:
initZero();
break;
//回退按钮
case R.id.btn_back:
clear();
break;
//四则运算符
case R.id.btn_plus:
case R.id.btn_minus:
case R.id.btn_divide:
case R.id.btn_multi:
operator = inputText;
show(showText + operator);
break;
//求导数
case R.id.btn_fraction:
result = String.valueOf(getFraction());
//刷新结果
refreshRes(result);
//显示
show(showText + "/=" +result);
break;
//求开方
case R.id.btn_radical:
result = String.valueOf(getRadical());
//刷新结果
refreshRes(result);
//显示
show(showText + "/=" +result);
break;
//等号
case R.id.btn_equal:
result = String.valueOf(getRes());
//刷新结果
refreshRes(result);
//显示
show(showText + "=" +result);
break;
default:
//无运算符 则输入数字为第一个数
if (operator.equals("")) {
firstNum = firstNum + inputText;
} else {
secondNum = secondNum + inputText;
}
//判断是否首先输入了0或者小数点
if (showText.equals("0") && !inputText.equals(".")) {
show(inputText);
} else {
//显示输入的操作数
show(showText + inputText);
}
break;
}
}
private double getRadical() {
return Math.sqrt(Double.parseDouble(firstNum));
}
private double getFraction() {
return 1.0 / Double.parseDouble(firstNum);
}
private void initZero() {
showText = "0";
operator = "";
firstNum = "";
secondNum = "";
tv_res.setText(showText);
}
//清空操作
private void clear() {
showText = "";
operator = "";
firstNum = "";
secondNum = "";
tv_res.setText(showText);
}
//show input
private void show(String text) {
showText = text;
tv_res.setText(showText);
}
private double getRes() {
switch (operator) {
case "+":
return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
case "-":
return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
case "*":
return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
default:
return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
}
}
//运行equal后刷新状态
private void refreshRes(String new_res) {
result = new_res;
firstNum=result;
secondNum="";
operator="";
}
}
以上代码可实现简易计算器的运算,但存在Bug,但是简单的计算是没问题。