先看最终效果:

1.首先创建一个Empty Activity

2.在activity_main.xml里编写主界面布局
根据预览图,主界面需要一个ListView和一个ImageButton,还要给ImageButton添加一个Onclick事件,将按钮的UI图片tianjia.png放入drawable文件夹

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"tools:context=".MainActivity"><ListViewandroid:id="@+id/list_view"android:layout_width="wrap_content"android:layout_height="650dp"/><ImageButtonandroid:id="@+id/add"android:onClick="addAccount"android:layout_width="80dp"android:layout_height="80dp"android:scaleType="centerInside"android:layout_centerHorizontal="true"android:background="#00FF0000"android:src="@drawable/tianjia"android:layout_below="@+id/list_view" />
</RelativeLayout>

android:background="#00FF0000"这行代码的意思是让imageButton的背景为透明。如果不设置这行代码,背景就是默认的灰色;也可以设置为白色,但是自带的app底色并不是纯白的,仔细看会发现色差:

那么写完主界面布局后Preview里就是这样:

3.接下来开始写ListView,也就是单个item的布局:新建一个布局文件


命名为list_item

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="80dp"><TextViewandroid:id="@+id/tv_title"android:layout_width="150dp"android:layout_height="80dp"android:layout_marginLeft="10dp"android:layout_alignParentLeft="true"android:gravity="center"android:singleLine="true"android:textSize="20sp"android:ellipsize="marquee"android:text="costTitle" /><TextViewandroid:id="@+id/tv_date"android:layout_width="wrap_content"android:layout_height="80dp"android:gravity="center"android:textSize="20sp"android:layout_marginLeft="15dp"android:layout_toRightOf="@+id/tv_title"android:text="2020-05-31"/><TextViewandroid:id="@+id/tv_money"android:layout_width="wrap_content"android:layout_height="80dp"android:gravity="center"android:layout_alignParentRight="true"android:layout_marginRight="20dp"android:textSize="25sp"android:textColor="#ffbd27"android:text="25"/>
</RelativeLayout>

效果:

4.写完listView之后最重要的就是为它添加适配器,这样它才能把获取的数据按照格式显示在主界面中
新建类:
命名为ListAdapter
这里采用的是BaseAdapter

package com.example.myaccountapp;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.List;public class ListAdapter extends BaseAdapter {List<costList> mList;public ListAdapter(List<costList>list){mList=list;}@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return mList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view=mLayoutInflater.inflate(R.layout.list_item,null);//取出数据赋值costList item=mList.get(position);TextView tv_title=view.findViewById(R.id.tv_title);TextView tv_date=view.findViewById(R.id.tv_date);TextView tv_money=view.findViewById(R.id.tv_money);//绑定tv_title.setText(mList.get(position).getTitle());tv_date.setText(mList.get(position).getDate());tv_money.setText(mList.get(position).getMoney());return view;}private List<costList>getmList;private LayoutInflater mLayoutInflater;public ListAdapter(Context context,List<costList>list){mList=list;//通过外部传来的Context初始化LayoutInflater对象mLayoutInflater=LayoutInflater.from(context);}
}

5.搭建数据库
Sqlite的运用是重难点
首先创建一个DBHelper类:按第四步的方法新建类,命名为:DBHelper

package com.example.myaccountapp;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;public class DBHelper extends SQLiteOpenHelper {private static int DB_VERSION = 1;private static String DB_NAME = "account_daily.db";public DBHelper(Context context) {super(context, DB_NAME ,null, DB_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {String sql="create table account(_id integer primary key autoincrement," +//主键"Title varchar(20)," +//Title"Date varchar(20)," +//Date"Money vaechar(20))";//Moneydb.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}
}

然后我们写一个类专门存放赋值和取出这些数据的方法,命名为costList

package com.example.myaccountapp;public class costList {private String _id;private String Title;private String Date;private String Money;public String getMoney() {return Money;}public void setMoney(String money) {Money = money;}public String getDate() {return Date;}public void setDate(String date) {Date = date;}public String getTitle() {return Title;}public void setTitle(String title) {Title = title;}public String get_id() {return _id;}public void set_id(String _id) {this._id = _id;}
}

6.来到MainActivity开始写方法:

package com.example.myaccountapp;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity {private DBHelper helper;private  ListView listView;private  ImageButton Add;private List<costList>list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}//初始化private void initData() {list=new ArrayList<>();SQLiteDatabase db=helper.getReadableDatabase();Cursor cursor=db.query("account",null,null,null,null,null,null);while (cursor.moveToNext()){costList clist=new costList();//构造实例clist.set_id(cursor.getString(cursor.getColumnIndex("_id")));clist.setTitle(cursor.getString(cursor.getColumnIndex("Title")));clist.setDate(cursor.getString(cursor.getColumnIndex("Date")));clist.setMoney(cursor.getString(cursor.getColumnIndex("Money")));list.add(clist);}//绑定适配器listView.setAdapter(new ListAdapter(this,list));db.close();}private void initView() {helper=new DBHelper(MainActivity.this);listView = findViewById(R.id.list_view);Add=findViewById(R.id.add);
}//事件:添加
public void addAccount(View view){//跳转Intent intent=new Intent(MainActivity.this,new_cost.class);startActivityForResult(intent,1);
}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if(requestCode==1&&resultCode==1){this.initData();}}
}

7.可以看到我们必须给之前的Onclick事件写一个方法(addAccount)。即点击+号按钮跳转到一个新页面,在这个新页面,我们要完成输入Title、Date、Money的操作。
这就需要新建一个Activity,命名为new_cost

生成Activity时系统会同时生成一个java文件和一个layout文件,名为
在这个文件中开始写新建项的布局,如本文开头的第二张图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><EditTextandroid:id="@+id/et_cost_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="4dp"android:hint="Cost Title"android:textColor="#ffbd27"/><EditTextandroid:id="@+id/et_cost_money"android:inputType="number|numberDecimal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="4dp"android:hint="Cost Money"android:textColor="#ffbd27"/><DatePickerandroid:id="@+id/dp_cost_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="8dp"android:datePickerMode="spinner"android:calendarViewShown="false"/><Buttonandroid:onClick="okButton"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="确认"android:textSize="20dp"android:textColor="#333333"android:background="#ffbd27"android:layout_marginLeft="40dp"android:layout_marginRight="40dp"/>
</LinearLayout>


new_cost.java中:

package com.example.myaccountapp;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Toast;import java.text.SimpleDateFormat;
import java.util.Date;public class new_cost extends AppCompatActivity {private DBHelper helper;private EditText et_cost_title;private EditText et_cost_money;private DatePicker dp_cost_date;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_new_cost);initView();}private void initView() {helper = new DBHelper(new_cost.this);et_cost_title = findViewById(R.id.et_cost_title);et_cost_money = findViewById(R.id.et_cost_money);dp_cost_date = findViewById(R.id.dp_cost_date);}public void okButton(View view) {String titleStr = et_cost_title.getText().toString().trim();String moneyStr = et_cost_money.getText().toString().trim();String dateStr = dp_cost_date.getYear() + "-" + (dp_cost_date.getMonth() + 1) + "-"+ dp_cost_date.getDayOfMonth();//这里getMonth会比当前月份少一个月,所以要+1if ("".equals(moneyStr)) {//可以不填写Title但是不能不填金额Toast toast = Toast.makeText(this, "请填写金额", Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER, 0, 0);toast.show();} else {SQLiteDatabase db = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("Title", titleStr);values.put("Money", moneyStr);values.put("Date", dateStr);long account = db.insert("account", null, values);if (account > 0) {Toast toast = Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER, 0, 0);toast.show();setResult(1);finish();} else {Toast toast = Toast.makeText(this, "请重试", Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER, 0, 0);toast.show();db.close();}setResult(1);finish();}}
}

toast.setGravity(Gravity.CENTER, 0, 0);这行代码是设置小提示框显示的位置,如果不设置的话,默认是显示在底部的

完成!
接下来还可以优化一下ui,比如把题头栏状态栏换成黄色(默认是绿色的),光标也是可以换色的。还比如把按钮换成圆角样式。大家自己研究吧。

1.0版本只有非常简单的记账功能,也许还会更新2.0,就是增加一些衣食住行分类查看,按月份查看的功能之类的

有什么问题的话可以在评论区问我哦,我有能力的话会尽量解答的。不过我也是新手,总之大家共同进步吧

CSDN突然把我上传的源码调高了积分,贵得离谱,这边提供网盘,有需要自取:
链接:https://pan.baidu.com/s/1-LEyhXZRWzz0hTHJvC8sLg
提取码:f59z

AndroidStudio 制作一个超简易记账本App(1.0)【含详细步骤】相关推荐

  1. Android——一个简单的记账本APP

    一个简单的记账本APP 视频效果预览 添加账目记录 效果预览 添加账目记录实现 简述 实现 获取日期 字符串时间戳转Date Date转星期 获取时间 Switch控制显示和隐藏 更改Switch样式 ...

  2. 初识Android 制作一个简单的记账本

    初识Android 制作一个简单的记账本 主要功能 实现一个记账本页面 可以添加数据并更新到页面中 主要步骤 运行截图 主页面 点击红色按钮弹出添加页面 完成后自动更新到目录下 主要功能 实现一个记账 ...

  3. 阿里P7大牛,纯CSS教你制作一个超简易图片放大镜

    今天会介绍一个在商城网站经常看到的功能,图片放大镜的效果: 我们试试用最少的 JavaScript,尽量使用 CSS 以及最简单的 HTML 结构去实现,那我们就开始啦. HTML 的部份 打开 Co ...

  4. 如何制作一个简单的短视频 app

    如果想制作一个简单的短视频 app,可以考虑以下步骤: 确定 app 的目标和功能:需要明确 app 的目标受众和提供的功能,以确定 app 的整体设计方向. 选择开发平台:根据自己的技术能力和预算选 ...

  5. 安卓app源码和设计报告——简易记账本

    课 程 设 计(实训)说 明 书 题目 实现简易记账本功能 专 业 班 级 学生姓名 同组学生 指导老师 课程设计(实训)评语 学生姓名 专业 班级 2 题目 实现简易记账本功能 评语: 成绩: 优 ...

  6. 【有利可图网】PS实战系列:PS设计制作一个超赞的漂亮艺术花纹人像海报

    本篇教你如何巧用PS设计制作一个超赞的漂亮艺术花纹人像海报!教程清晰明了,制作过程灰常巧妙,许多曲线也是用花朵液化得到效果,这样既能省去画线条繁琐过程,也可让作品变得极具艺术感!

  7. 安卓开发记账本app

    安卓记账本app 功能实现 支出与收入的增删改查,饼状图实现占比动画展示.增加拍照功能 模块介绍 系统开发技术介绍 将数据以饼状图的形式展示占比 主要思想:通过sumValue求出数据库中所有数据的总 ...

  8. python(pygame)开发一个超简易版消灭病毒

    python(pygame)开发一个超简易版消灭病毒 消灭病毒游戏 以下是游戏代码:每个类都是一个py文件,需要导包 1.主程序代码 2.飞机类 3.子弹类 4.病毒类 消灭病毒游戏 消灭病毒是一个打 ...

  9. 送学妹的生日礼物~ 制作一个超浪漫的告白3D相册(HTML+CSS+JavaScript)520情人节/七夕情人节/程序员表白...

    ❉ 送学妹的生日礼物~ 制作一个超浪漫的告白3D相册(HTML+CSS+JavaScript) ​​一年一度的520情人节/七夕情人节/女朋友生日/程序员表白​​,是不是要给女朋友或者正在追求的妹子一 ...

最新文章

  1. 【干货】.NET WebApi HttpMessageHandler管道
  2. java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)
  3. MacOS开发必备工具brew,安装nginx反向代理,替代linux工具 apt-get和 yum...
  4. Dima and a Bad XOR
  5. stm32 之引脚和各功能模块间关系
  6. Java8新特性--CompletableFuture
  7. LeetCode Smallest Range
  8. “新型冠状病毒国家科技资源服务系统”入选全球15项世界互联网领先科技成果...
  9. 强化学习《基于策略价值 - Pathwise Derivative Policy Grident》
  10. ubuntu16.04安装搜狗拼音2.0.0.0072
  11. 基于socket的C语言编程,C语言实现的Socket编程
  12. docker容器笔记
  13. python类的实例方法必须创建对象后_python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解...
  14. 计算机应用基础周记,2800字计算机应用基础实习报告范文.doc
  15. JAVA——【案例】实现计算机系信息管理系统(教师和学生信息管理)
  16. 百度翻译反向js——破解反爬虫
  17. YouTube 双字幕浏览器辅助
  18. 用C语言循环码,xinxilunyubianma
  19. 向gitlab推送push时报nullSha1: contains entries pointing to null sha1
  20. [虚幻引擎] UE4/5数字孪生 制作城市光束效果

热门文章

  1. 游戏手柄之自定义按钮控制海龟
  2. tensorflow中axis理解非常重要
  3. 不要因为不知,所以设计
  4. 中国地热能产业需求预测与投资规划建议报告2022-2028年版
  5. stackoverflow 搜索问题技巧
  6. Blend for Visual Studio 让XAML也可以像WinForm一样可视化设计,Blend 与Studio的区别
  7. 城市文化笔记整理(二)
  8. linux运行vb程序,Linux可执行文件ELF结构及程序加载运行
  9. 淘宝API item_search_jupage - 天天特价
  10. C51单片机 AT89S52 定时器使用方法及总结