前言:
最近在学习安卓开发,之前对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的分享