安卓开发例程之计算器项目

前言:

最近在学习安卓开发,之前对java做了一点简单的了解之后,就去尝试使用Android Studio做个简单的项目,来熟悉熟悉安卓的开发,于是写本篇文章记录,不足之处请见谅。

基础夯实:

安卓开发的基础涉及多个方面,包括编程语言、开发环境、应用组件、用户界面设计、数据存储、网络通信等。以下是对这些基础知识的详细阐述:

一、编程语言
安卓应用通常使用Java或Kotlin编写。Kotlin是一种现代的、更易于使用的编程语言,逐渐成为首选。这两种语言都提供了丰富的类库和API,用于开发各种类型的应用。

二、开发环境
Android Studio是官方的Android应用开发集成开发环境(IDE)。它提供了用于编写、测试和调试应用程序的工具,包括代码编辑器、构建工具、模拟器等。开发者可以在Android Studio中创建项目、编写代码、运行和调试应用。

三、应用组件
安卓应用由多个组件组成,包括Activity(用户界面)、Service(后台任务处理)、BroadcastReceiver(接收广播消息)和ContentProvider(数据共享)。这些组件在应用中扮演着不同的角色,共同实现应用的功能。

Activity:代表应用程序的一个屏幕,是用户与应用交互的主要界面。每个Activity都有与之相关联的Java或Kotlin类,用于处理用户输入和显示数据。
Service:在后台执行长时间运行的操作,而不提供用户界面。Service可以用于执行下载任务、播放音乐等。
BroadcastReceiver:用于接收系统或其他应用发送的广播消息。BroadcastReceiver可以触发相应的操作,如更新UI、启动服务等。
ContentProvider:用于在不同的应用之间共享数据。通过定义ContentProvider,应用可以对外提供数据访问接口,其他应用可以通过这个接口访问数据。
四、用户界面设计
安卓应用的用户界面是使用XML文件定义的,通常使用XML布局文件进行设计。Android提供了丰富的用户界面组件,如按钮、文本框、列表视图等。开发者可以通过组合这些组件来创建复杂的用户界面。

此外,安卓还支持不同的布局类型,如线性布局、相对布局、帧布局、表格布局、网格布局等。这些布局类型可以帮助开发者灵活地组织用户界面元素。

五、数据存储
安卓应用通常需要存储数据,可以使用SharedPreferences、SQLite数据库或文件存储来实现。

SharedPreferences:用于存储简单的键值对数据。它通常用于保存用户偏好设置等轻量级数据。
SQLite数据库:一个轻量级的嵌入式关系数据库,适用于存储结构化数据。SQLite数据库提供了创建表、插入数据、查询数据等功能。
文件存储:通过读写文件来存储数据。开发者可以在应用的私有存储空间中创建文件,用于保存图片、音频等文件数据。
六、网络通信
安卓应用可以通过HTTP请求与网络服务通信。了解如何进行网络请求和处理响应是关键。开发者可以使用Android提供的网络编程API,如HttpURLConnection、HttpClient等,来发送和接收网络数据。

七、调试和测试
学会使用Android Studio的调试工具,如日志、断点和监视器,以便识别和解决问题。此外,开发者还可以使用模拟器或真实设备来测试应用的功能和性能。

八、应用发布
了解如何为Google Play商店打包和发布应用程序,包括签名应用、准备图标和描述等。发布前,开发者需要确保应用符合Google Play商店的政策和要求。

综上所述,安卓开发的基础涉及多个方面,需要开发者掌握编程语言、熟悉开发环境、了解应用组件、掌握用户界面设计技巧、熟悉数据存储和网络通信原理,并学会调试和测试应用。通过不断学习和实践,开发者可以逐步提高自己的安卓开发能力。

效果展示:

在这里插入图片描述
在这里插入图片描述

实现功能:

计算器的简易功能,加减乘除,开根号,求导数

未解决的问题:

一些闪退问题,布局和逻辑问题,欢迎在我的代码上二次开发,我暂时的目的是对安卓进行熟悉。

核心代码:

package com.example.wangning;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener {
    
    

    private TextView tv_result;
    private String firstNum = "";
    private String operator = "";
    private String secondNum = "";
    private String result = "";
    private String showText = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculator);
        tv_result = findViewById(R.id.tv_result);
        findViewById(R.id.CE_button).setOnClickListener(this);
        findViewById(R.id.divide_button).setOnClickListener(this);
        findViewById(R.id.multiply_button).setOnClickListener(this);
        findViewById(R.id.C_button).setOnClickListener(this);
        findViewById(R.id.seven_button).setOnClickListener(this);
        findViewById(R.id.eight_button).setOnClickListener(this);
        findViewById(R.id.nine_button).setOnClickListener(this);
        findViewById(R.id.plus_button).setOnClickListener(this);
        findViewById(R.id.four_button).setOnClickListener(this);
        findViewById(R.id.five_button).setOnClickListener(this);
        findViewById(R.id.six_button).setOnClickListener(this);
        findViewById(R.id.minus_button).setOnClickListener(this);
        findViewById(R.id.one_button).setOnClickListener(this);
        findViewById(R.id.two_button).setOnClickListener(this);
        findViewById(R.id.three_button).setOnClickListener(this);
        findViewById(R.id.sqrt_button).setOnClickListener(this);
        findViewById(R.id.reciprocal_button).setOnClickListener(this);
        findViewById(R.id.zero_button).setOnClickListener(this);
        findViewById(R.id.dot_button).setOnClickListener(this);
        findViewById(R.id.equal_button).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
    
    
        String inputText = "";
        if (v.getId() == R.id.sqrt_button) {
    
    
            if (!firstNum.isEmpty() && isNumeric(firstNum) && Double.parseDouble(firstNum) >= 0) {
    
    
                double sqrt_result = Math.sqrt(Double.parseDouble(firstNum));
                refreshOperate(String.valueOf(sqrt_result));
                refreshText(showText + "√" + firstNum + "=" + result);
                firstNum = "";  // 重置firstNum,因为已经完成了运算
            } else {
    
    
                Toast.makeText(this, "Invalid input for square root", Toast.LENGTH_SHORT).show();
            }
        } else if (v.getId() == R.id.reciprocal_button) {
    
    
            if (!firstNum.isEmpty() && isNumeric(firstNum) && !firstNum.equals("0")) {
    
    
                double reciprocal_result = 1.0 / Double.parseDouble(firstNum);
                refreshOperate(String.valueOf(reciprocal_result));
                refreshText(showText + "1/" + firstNum + "=" + result);
                firstNum = "";  // 重置firstNum,因为已经完成了运算
            } else {
    
    
                Toast.makeText(this, "Invalid input for reciprocal", Toast.LENGTH_SHORT).show();
            }
        } else if (v instanceof TextView) {
    
    
            inputText = ((TextView) v).getText().toString();
        }

        switch (v.getId()) {
    
    
            case R.id.C_button:
            case R.id.CE_button:
                clear();
                break;
            case R.id.plus_button:
            case R.id.minus_button:
            case R.id.multiply_button:
            case R.id.divide_button:
                operator = inputText;
                firstNum = showText.replace(operator, "");  // 固定firstNum的值
                refreshText(firstNum + operator);
                break;
            case R.id.equal_button:
                if (!operator.isEmpty() && !secondNum.isEmpty()) {
    
    
                    double calculate_result = calculateFour();
                    refreshOperate(String.valueOf(calculate_result));
                    refreshText(showText + "=" + result);
                } else {
    
    
                    Toast.makeText(this, "Invalid operation", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                if (operator.isEmpty()) {
    
    
                    firstNum = firstNum + inputText;
                } else {
    
    
                    secondNum = secondNum + inputText;
                }
                if (showText.equals("0") && !inputText.equals(".")) {
    
    
                    refreshText(inputText);
                } else {
    
    
                    refreshText(showText + inputText);
                }
        }
    }

    private double calculateFour() {
    
    
        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);
            case "/":
                if (secondNum.equals("0")) {
    
    
                    Toast.makeText(this, "Division by zero", Toast.LENGTH_SHORT).show();
                    return Double.NaN;
                }
                return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
            default:
                return 0;
        }
    }

    private void clear() {
    
    
        firstNum = "";
        operator = "";
        secondNum = "";
        result = "";
        showText = "";
        refreshText("");
    }

    private void refreshOperate(String new_result) {
    
    
        result = new_result;
        operator = "";
        secondNum = "";
    }

    private void refreshText(String text) {
    
    
        showText = text;
        tv_result.setText(showText);
    }

    private boolean isNumeric(String str) {
    
    
        return str != null && str.matches("-?\\d+(\\.\\d+)?");
    }
}
<?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="@color/white"
    android:padding="5dp"

    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:text="@string/simple_calculator"
                android:gravity="center"
                android:textColor="@color/black"
                android:textSize="20sp">
            </TextView>

            <TextView
                android:id="@+id/tv_result"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:lines="3"
                android:text="0"
                android:gravity="right|bottom"
                android:textColor="@color/black"
                android:textSize="20sp">
            </TextView>

            <GridLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:columnCount="4"
                android:rowCount="5">
                //第一行
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/CE_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/cancelCE"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/divide_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/divide"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/multiply_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/multiply"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/C_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/cancelC"
                    android:textSize="@dimen/button_font_size">
                </Button>
                //第二行
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/seven_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/seven"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/eight_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/eight"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/nine_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/nine"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/plus_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/plus"
                    android:textSize="@dimen/button_font_size">
                </Button>
                //第三行
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/four_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/four"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/five_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/five"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/six_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/six"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/minus_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/minus"
                    android:textSize="@dimen/button_font_size">
                </Button>
                //第四行
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/one_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/one"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/two_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/two"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/three_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/three"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <ImageButton
                    android:id="@+id/sqrt_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:src="@drawable/extraction">
                </ImageButton>
                //第五行
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/reciprocal_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/reciprocal"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/zero_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/zero"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/dot_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/dot"
                    android:textSize="@dimen/button_font_size">
                </Button>
                <Button
                    android:backgroundTint="@android:color/darker_gray"
                    android:id="@+id/equal_button"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/button_height"
                    android:layout_columnWeight="1"
                    android:textColor="@color/black"
                    android:gravity="center"
                    android:text="@string/equal"
                    android:textSize="@dimen/button_font_size">
                </Button>
            </GridLayout>

        </LinearLayout>
    </ScrollView>


</LinearLayout>

源码分享:

通过网盘分享的文件:ISevening
链接: https://pan.baidu.com/s/1DOZW0kNUKZeMLJn26RYsdg?pwd=teua 提取码: teua
–来自百度网盘超级会员v4的分享

猜你喜欢

转载自blog.csdn.net/qq_54122113/article/details/143159847