继昨天的开发,继续完成今天的内容。

(一)开始构建一些业务逻辑,开始构建记账本的添加一笔记账的功能。

①对fab按钮的click时间进行修改,创建一个AlertDialog.Builder对象,因此我们给dialog添加一个布局,命名为new_cost_data.xml,位于他的布局很简单,我们只需要设置两个编辑框,和一个时间选择框即可。

new_cost_data.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"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"/><EditTextandroid:id="@+id/et_cost_money"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="4dp"android:hint="Cost Money"/><DatePickerandroid:id="@+id/dp_cost_data"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="4dp"android:datePickerMode="spinner"android:calendarViewShown="false"/>
</LinearLayout>

②然后回到主程序,在fab点击事件里创建一个 LayoutInflater用他来创建view,将新布局传到新建立的View对象,这样就可以获取到布局文件的内容,获取后将该布局设置给dialog对象,然后需要给dialog设置监听事件,当点击ok的监听事件,就将从布局中获取的信息传给一个CostBean对象,在用数据库进行添加,收集数据的mCostBeanList对象也要进行添加,最后再进行刷新(mAdapter.notifyDataSetChanged();),点击cancel就会取消该view界面,最后不要忘了显示该dialog。

MainActivity代码:

package com.example.xlfbook;import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private List<CostBean> mCostBeanList;private DatabaseHelper mdatabaseHelper;private CostListAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = findViewById(R.id.toolbar);setSupportActionBar(toolbar);mdatabaseHelper=new DatabaseHelper(this);mCostBeanList=new ArrayList<>();ListView costList=(ListView)findViewById(R.id.lv_main);initCostData();mAdapter = new CostListAdapter(this, mCostBeanList);costList.setAdapter(mAdapter);FloatingActionButton fab = findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);LayoutInflater inflater=LayoutInflater.from(MainActivity.this);View viewDialog=inflater.inflate(R.layout.new_cost_data,null);final EditText title=(EditText) viewDialog.findViewById(R.id.et_cost_title);final EditText money=(EditText)viewDialog.findViewById(R.id.et_cost_money);final DatePicker date=(DatePicker) viewDialog.findViewById(R.id.dp_cost_data);builder.setView(viewDialog);builder.setTitle("New Cost");builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {CostBean costBean=new CostBean();costBean.costTitle=title.getText().toString();costBean.costMoney=money.getText().toString();costBean.costDate=date.getYear()+"-"+(date.getMonth()+1)+"-"+date.getDayOfMonth();mdatabaseHelper.insertCost(costBean);mCostBeanList.add(costBean);mAdapter.notifyDataSetChanged();}});builder.setNegativeButton("Cancel",null);//点击取消builder.create().show();//显示dialog的布局
            }});}private void initCostData() {// mdatabaseHelper.deleteAllData();/* CostBean costBean=new CostBean();for (int i=0;i<6;i++) {costBean.costTitle=i+"imooc";costBean.costDate="11-11";costBean.costMoney="20";mdatabaseHelper.insertCost(costBean);}*/Cursor cursor=mdatabaseHelper.getAllCostData();if(cursor!=null){while(cursor.moveToNext()){CostBean costBean1=new CostBean();costBean1.costTitle=cursor.getString(cursor.getColumnIndex("cost_title"));costBean1.costDate=cursor.getString(cursor.getColumnIndex("cost_date"));costBean1.costMoney=cursor.getString(cursor.getColumnIndex("cost_money"));mCostBeanList.add(costBean1);}cursor.close();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_chart) {Intent intent=new Intent(MainActivity.this,ChartsActivity.class);intent.putExtra("cost_list", (Serializable) mCostBeanList);startActivity(intent);return true;}return super.onOptionsItemSelected(item);}
}

接下来简单的添加一笔帐单的功能已经可以实现,我们来添加一笔账单试试效果。

(二)开始制作图表

图表的制作我们会用到第三方库hellocharts,具体可以登录该网址查看————https://github.com/lecho/hellocharts-android

接下来在Android Studio中导入该库,在build中的dependencies中导入该github就可以了

接下来首先创建一个布局文件,来展示我们的chart图表。

chart_view

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:padding="10dp"><lecho.lib.hellocharts.view.LineChartViewandroid:id="@+id/chart"android:padding="20dp"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

然后再创建一个ChartsActivity.java,再修改主程序中的右上角的内容,在上面主程序的代码中可以看到,就是下面代码,把之前的setting改为chart

public boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_chart) {Intent intent=new Intent(MainActivity.this,ChartsActivity.class);intent.putExtra("cost_list", (Serializable) mCostBeanList);startActivity(intent);return true;}return super.onOptionsItemSelected(item);}

更改menu_main中的信息

<menu 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"tools:context="com.example.xlfbook.MainActivity"><itemandroid:id="@+id/action_chart"android:orderInCategory="100"android:title="Charts"app:showAsAction="never" />
</menu>

ChartsActivity.java

package com.example.xlfbook;import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;import androidx.annotation.Nullable;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.ChartData;
import lecho.lib.hellocharts.model.Line;
import lecho.lib.hellocharts.model.LineChartData;
import lecho.lib.hellocharts.model.PointValue;
import lecho.lib.hellocharts.model.ValueShape;
import lecho.lib.hellocharts.util.ChartUtils;
import lecho.lib.hellocharts.view.Chart;
import lecho.lib.hellocharts.view.LineChartView;public class ChartsActivity extends Activity {private LineChartView mChart;private Map<String,Integer> table = new TreeMap<>();private LineChartData mData;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.chart_view);mChart = (LineChartView) findViewById(R.id.chart);mData = new LineChartData();List<CostBean> allDate = (List<CostBean>) getIntent().getSerializableExtra("cost_list");generateValues(allDate);generateData();}private void generateData() {List<Line> lines = new ArrayList<>();List<PointValue> values = new ArrayList<>();int indexX = 0;for(Integer value : table.values()){values.add(new PointValue(indexX, value));indexX++;}Line line = new Line(values);line.setColor(ChartUtils.COLORS[0]);line.setShape(ValueShape.CIRCLE);line.setPointColor(ChartUtils.COLORS[1]);lines.add(line);mData.setLines(lines);mChart.setLineChartData(mData);}private void generateValues(List<CostBean> allDate) {if(allDate != null){for (int i = 0; i < allDate.size(); i++) {CostBean costBean = allDate.get(i);String costDate = costBean.costDate;int costMoney = Integer.parseInt(costBean.costMoney);if(!table.containsKey(costDate)){table.put(costDate,costMoney);}else {int originMoney = table.get(costDate);table.put(costDate,originMoney + costMoney);}}}}
}

这就是由我们的数据生成的折线图,还有待完善(坐标线还没搞明白怎么添加)

至此,该记账本的简单记账功能以及图表显示功能得以实现。在真机上经过测试,可以使用。

github:

android开发实战-记账本APP(二)相关推荐

  1. android记账app开发全过程,android开发实战-记账本APP(一)

    记账本开发流程: 对于一个记账本的初步开发而言,我实现的功能有: ①实现一个记账本的页面 ②可以添加数据并更新到页面中 ③可以将数据信息以图表的形式展现 (一)首先,制作一个记账本的页面. ①在系统自 ...

  2. Android项目实战:账本APP开发

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 Java项目实战:账本APP服务 ...

  3. Android开发实战---一个汽车销售APP,有汽车列表页、汽车详情页、贷款计算页3个界面。

    Android开发实战设计并实现一个汽车销售APP,要求至少有汽车列表页.汽车详情页.贷款计算页3个界面. 已开源:https://github.com/yan123666/wlf 实现结果: 1.计 ...

  4. Android开发学习——记单词APP安卓注册登录跳转

    登陆页面XML <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayo ...

  5. 【Android项目实战 | 从零开始写app(十二)】实现app首页智慧服务热门推荐热门主题、新闻

    说在前面,由于各种adapter,xml布局,bean实体类,Activity,也为了让看懂,代码基本都是"简单粗暴直接不好看",没啥okhttp和util工具类之类的封装,本篇幅 ...

  6. 【Android项目实战 | 从零开始写app (六) 】用TabLayout+ViewPager搭建App 框架主页面底部导航栏

    本篇实现效果: 搭建app框架的方式有很多,本节主要用TabLayout+ViewPager搭建App框架,这种方式简单易实现,在主页中加载Fragment碎片,实现不同功能页面的切换效果图如下: 文 ...

  7. 【Android项目实战 | 从零开始写app(十三)】实现用户中心模块清除token退出登录信息修改等功能

    五一后,被ji金伤了,哇呜呜,还是得苦逼老老实实打工写代码,看下面吧 本篇实现效果: 实现登录用户名展示到用户中心页面上,并且页面有个人信息,订单列表,修改密码,意见反馈发送到服务端,前面登录后,通过 ...

  8. 【Android项目实战 | 从零开始写app一一智慧服务】完结篇系列导航篇、源代码

    目录 文章介绍 涉及知识 系列汇总 项目源代码 文章介绍 本系列小文是一个简单的Android app项目实战,对于刚入门Android 的初学者来说,基础学完了,但是怎么综合的去写一个小app,可能 ...

  9. 安卓开发记账本app

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

  10. 《Android Studio开发实战》学习(二)- 聊天室

    <Android Studio开发实战>学习(二)- 聊天室 背景 聊天室布局文件的编写 聊天室代码文件的编写 运行结果 背景 在前一篇文章 1中实现了使用Android Studio开发 ...

最新文章

  1. 管线命令 cut grep
  2. Python基础知识一
  3. weblogic jprofile配置
  4. flash一个按钮控制动画_PLC三组灯用一个按钮控制
  5. mui HTML5 plus 下载文件
  6. M1 版 MacBook SSD 为何会损耗巨大?
  7. php模板建站seo,phpwin建站教程,phpwind模板
  8. python读取rar文件_Python 解压缩文件详解!
  9. php解析微信emoji字符
  10. 黑客社会工程学攻击特别危险,你知道多少?
  11. 想做个磁力链搜索引擎 3
  12. 七月份的尾巴是狮子座
  13. 【转】偷偷告诉你快速提高app下载量和安装量
  14. 【2309. 兼具大小写的最好英文字母】
  15. 图论初步(存储+最短路)
  16. 猫学习IOS(四)UI半小时就搞定Tom猫
  17. 十年后,我终于读懂了紫霞那滴留在至尊宝心中的泪
  18. Could not load file or assembly ‘NPOI.OOXML, Version=2.5.5.0, Culture=neutral, PublicKeyToken=0df73e
  19. 云时代的mysql dba_美团MySQL巡检系统:上线一年,治理8000+核心隐患
  20. 从尾到头打印一个链表

热门文章

  1. 手机型号大全_《华为手机型号大全》值得收藏
  2. win7开机动画自定义
  3. 袁春风 计算机组成原理 chap4,精品计算机组成原理 [袁春风]chap4homework.pdf
  4. 清科2017医美行业研究报告:消费者搅动产业变局
  5. Python推箱子小游戏源代码
  6. 网络空间安全复习归纳
  7. Androd TV开发-前言
  8. uat测试用例和sit测试用例_集成测试和UAT测试(8.7)
  9. Python 编程语言
  10. 汽车企业售后业务数字化转型,究竟有多卷