当前位置: 首页 > news >正文

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

安卓开发计算器项目

  • 前言:
  • 基础夯实:
  • 效果展示:
  • 实现功能:
  • 未解决的问题:
  • 核心代码:
  • 源码分享:

前言:

最近在学习安卓开发,之前对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 = "";@Overrideprotected 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);}@Overridepublic 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"><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:text="@string/simple_calculator"android:gravity="center"android:textColor="@color/black"android:textSize="20sp"></TextView><TextViewandroid: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><GridLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:columnCount="4"android:rowCount="5">//第一行<Buttonandroid: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><Buttonandroid: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><Buttonandroid: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><Buttonandroid: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>//第二行<Buttonandroid: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><Buttonandroid: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><Buttonandroid: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><Buttonandroid: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>//第三行<Buttonandroid: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><Buttonandroid: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><Buttonandroid: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><Buttonandroid: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>//第四行<Buttonandroid: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><Buttonandroid: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><Buttonandroid: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><ImageButtonandroid:id="@+id/sqrt_button"android:layout_width="0dp"android:layout_height="@dimen/button_height"android:layout_columnWeight="1"android:src="@drawable/extraction"></ImageButton>//第五行<Buttonandroid: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><Buttonandroid: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><Buttonandroid: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><Buttonandroid: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的分享


http://www.mrgr.cn/news/56076.html

相关文章:

  • C#运动控制
  • 【ubuntu18.04】ubuntu18.04 编译LightGBM操作说明
  • 运行第一个go程序
  • 可编辑PPT | 生产及质量BI应用场景方案
  • 解决Git合并冲突:掌握版本控制的精髓
  • 是时候和传统源代码保密方案说拜拜了
  • springboot 同时上传文件和JSON对象
  • RHCE--nginx实现多IP访问多网站
  • 一文搞定栈与队列
  • [AOSPXRef]看安卓源码搜索使用解释
  • 设置虚拟机与windows间的共享文件夹
  • 每日一题|1497. 检查数组对是否可以被 k 整除|两数之和的模运算
  • 在分类内用最大最小值筛选(每个分类找出一个)
  • 振弦式传感器在高边坡监测中发挥哪些优势?
  • 文心一言 VS 讯飞星火 VS chatgpt (375)-- 算法导论24.4 7题
  • WPS电信定制版 v12.8.2.18205 自带 VBA\无广告
  • 【Linux】进程优先级
  • 大模型LLM算法工程师技术面试指南
  • 如果你不幸成为家里第一个GIS专业的学生
  • Active Directory(活动目录)密码审核工具
  • Macos m系列芯片环境下安装python3以及mysqlclient流程以及遇到的一系列问题
  • 进程控制 -- 详解
  • 13.5 Linux_网络编程_域名解析
  • 代码随想录算法训练营Day38 | 62. 不同路径、63. 不同路径 II
  • 桌面型数控机床应用于STEAM教育
  • Vue事件处理