安卓开发例程之计算器项目
安卓开发计算器项目
- 前言:
- 基础夯实:
- 效果展示:
- 实现功能:
- 未解决的问题:
- 核心代码:
- 源码分享:
前言:
最近在学习安卓开发,之前对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的分享