在本章节中,我们将通过开发一个简单的Android应用程序来进一步提升你的移动开发技能。我们将创建一个任务管理应用,该应用将允许用户添加、查看和删除任务。通过这个项目,你将学习如何使用Android Studio进行开发、设计用户界面、处理用户输入以及使用SQLite数据库进行数据存储。通过这个项目,你将全面掌握Android开发的基础知识和实践技巧。
项目需求
我们的目标是开发一个简单的任务管理Android应用,具有以下功能:
- 添加任务
- 查看所有任务
- 删除任务
项目设计
首先,我们设计应用的结构。应用将包含以下组件:
- MainActivity:显示任务列表和添加任务的界面
- Task:表示一个任务的实体类
- TaskAdapter:任务列表的适配器
- TaskDatabaseHelper:管理SQLite数据库的帮助类
创建Android项目
- 创建Android项目:在Android Studio中创建一个新的项目,选择Empty Activity模板。为项目命名,例如“TaskManager”。
- 项目结构:项目结构如下:
app ├── java │ └── com │ └── example │ └── taskmanager │ ├── MainActivity.java │ ├── Task.java │ ├── TaskAdapter.java │ └── TaskDatabaseHelper.java └── res ├── layout │ └── activity_main.xml └── values ├── colors.xml ├── strings.xml └── styles.xml
实体类
‘Task‘类表示一个任务,包含以下属性和方法:
package com.example.taskmanager;
public class Task {
private long id;
private String description;
public Task() {
}
public Task(long id, String description) {
this.id = id;
this.description = description;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
数据库帮助类
‘TaskDatabaseHelper‘类管理SQLite数据库的创建和版本管理:
package com.example.taskmanager;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class TaskDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "tasks.db";
private static final int DATABASE_VERSION = 1;
public TaskDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE tasks (id INTEGER PRIMARY KEY AUTOINCREMENT, description TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS tasks");
onCreate(db);
}
}
任务适配器
‘TaskAdapter‘类管理任务列表的显示:
package com.example.taskmanager;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
public class TaskAdapter extends BaseAdapter {
private Context context;
private ArrayList<Task> tasks;
private TaskDatabaseHelper dbHelper;
public TaskAdapter(Context context, ArrayList<Task> tasks, TaskDatabaseHelper dbHelper) {
this.context = context;
this.tasks = tasks;
this.dbHelper = dbHelper;
}
@Override
public int getCount() {
return tasks.size();
}
@Override
public Object getItem(int position) {
return tasks.get(position);
}
@Override
public long getItemId(int position) {
return tasks.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.task_item, parent, false);
}
TextView descriptionTextView = convertView.findViewById(R.id.task_description);
Button deleteButton = convertView.findViewById(R.id.delete_task);
Task task = tasks.get(position);
descriptionTextView.setText(task.getDescription());
deleteButton.setOnClickListener(v -> {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("tasks", "id=?", new String[]{String.valueOf(task.getId())});
tasks.remove(position);
notifyDataSetChanged();
});
return convertView;
}
}
主活动
‘MainActivity‘类管理应用的主界面和逻辑:
package com.example.taskmanager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private TaskDatabaseHelper dbHelper;
private TaskAdapter taskAdapter;
private ArrayList<Task> tasks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new TaskDatabaseHelper(this);
tasks = new ArrayList<>();
ListView taskListView = findViewById(R.id.task_list);
taskAdapter = new TaskAdapter(this, tasks, dbHelper);
taskListView.setAdapter(taskAdapter);
loadTasks();
EditText taskDescriptionEditText = findViewById(R.id.task_description);
Button addTaskButton = findViewById(R.id.add_task);
addTaskButton.setOnClickListener(v -> {
String description = taskDescriptionEditText.getText().toString();
if (!description.isEmpty()) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("INSERT INTO tasks (description) VALUES (?)", new Object[]{description});
taskDescriptionEditText.setText("");
loadTasks();
}
});
}
private void loadTasks() {
tasks.clear();
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM tasks", null);
while (cursor.moveToNext()) {
long id = cursor.getLong(cursor.getColumnIndexOrThrow("id"));
String description = cursor.getString(cursor.getColumnIndexOrThrow("description"));
tasks.add(new Task(id, description));
}
cursor.close();
taskAdapter.notifyDataSetChanged();
}
}
布局文件
在‘res/layout‘目录下创建‘activity_main.xml‘文件,定义主界面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/task_description"
android:layout_width="match_parent
android:layout_height="wrap_content"
android:hint="Enter task description" />
<Button
android:id="@+id/add_task"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add Task" />
<ListView
android:id="@+id/task_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp" />
</LinearLayout>
在‘res/layout‘目录下创建‘task_item.xml‘文件,定义任务列表项布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<TextView
android:id="@+id/task_description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="18sp" />
<Button
android:id="@+id/delete_task"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete" />
</LinearLayout>
配置文件
在‘res/values‘目录下,配置颜色、字符串和样式:
‘colors.xml‘
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#BB86FC</color>
<color name="purple_500">#6200EE</color>
<color name="purple_700">#3700B3</color>
<color name="teal_200">#03DAC5</color>
<color name="teal_700">#018786</color>
<color name="black">#000000</color>
<color name="white">#FFFFFF</color>
</resources>
‘strings.xml‘
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TaskManager</string>
<string name="hint_enter_task_description">Enter task description</string>
<string name="button_add_task">Add Task</string>
<string name="button_delete">Delete</string>
</resources>
‘styles.xml‘
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.TaskManager" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<item name="colorError">@color/teal_700</item>
<item name="colorOnError">@color/black</item>
<item name="colorSurface">@color/white</item>
<item name="colorOnSurface">@color/black</item>
<item name="colorBackground">@color/white</item>
<item name="colorOnBackground">@color/black</item>
</style>
</resources>
运行应用
运行应用后,可以使用任务管理功能,添加、查看和删除任务。
总结
通过本篇博客,我们开发了一个简单的任务管理Android应用。该应用展示了如何使用Android Studio进行开发、设计用户界面、处理用户输入以及使用SQLite数据库进行数据存储。通过这个项目,你不仅熟悉了Android开发的基本用法,还掌握了如何设计和实现一个实际的移动应用程序。希望你能通过这个项目进一步提升移动开发技能,为将来的复杂项目打下坚实的基础。祝你学习愉快,不断进步!