繼昨天的開發,繼續完成今天的內容。
(一)開始構建一些業務邏輯,開始構建記賬本的添加一筆記賬的功能。
①對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"> <EditText android:id="@+id/et_cost_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="4dp" android:hint="Cost Title"/> <EditText android:id="@+id/et_cost_money" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="4dp" android:hint="Cost Money"/> <DatePicker android: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; @Override protected 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() { @Override public 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() { @Override public 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(); } } @Override public 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; } @Override 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 SimplifiableIfStatement if (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.LineChartView android: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 SimplifiableIfStatement if (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"> <item android: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; @Override protected 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:https://github.com/happy-xlf/NoteBook