白骑士的Java教学项目实战篇 8.5 开发一个简单的Android应用

65 篇文章 0 订阅

        在本章节中,我们将通过开发一个简单的Android应用程序来进一步提升你的移动开发技能。我们将创建一个任务管理应用,该应用将允许用户添加、查看和删除任务。通过这个项目,你将学习如何使用Android Studio进行开发、设计用户界面、处理用户输入以及使用SQLite数据库进行数据存储。通过这个项目,你将全面掌握Android开发的基础知识和实践技巧。

项目需求

        我们的目标是开发一个简单的任务管理Android应用,具有以下功能:

  • 添加任务
  • 查看所有任务
  • 删除任务

项目设计

        首先,我们设计应用的结构。应用将包含以下组件:

  • MainActivity:显示任务列表和添加任务的界面
  • Task:表示一个任务的实体类
  • TaskAdapter:任务列表的适配器
  • TaskDatabaseHelper:管理SQLite数据库的帮助类

创建Android项目

  1. 创建Android项目:在Android Studio中创建一个新的项目,选择Empty Activity模板。为项目命名,例如“TaskManager”。
  2. 项目结构:项目结构如下:
    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开发的基本用法,还掌握了如何设计和实现一个实际的移动应用程序。希望你能通过这个项目进一步提升移动开发技能,为将来的复杂项目打下坚实的基础。祝你学习愉快,不断进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白骑士所长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值