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"><ScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid: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" /><TextViewandroid: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" /><GridLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:columnCount="4"android:rowCount="5"android:layout_marginTop="10dp"><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><ImageButtonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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"/><Buttonandroid: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;@Overrideprotected 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);}@Overridepublic 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 inputprivate 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,但是简单的计算是没问题。