一个毕业设计 家庭理财app
完整源碼:聯(lián)系qq? 332324956?
家庭理財(cái)app畢設(shè)內(nèi)容講解
?
└─com
???└─bs
???????└─lc
???????????├─dao
???????????│ ?????DBOpenHelper.java???//創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象
???????????│ ?????shouruDAO.java??//收入的數(shù)據(jù)庫(kù)接口
???????????│ ?????zhiochuDAO.java??//支出的數(shù)據(jù)庫(kù)接口
???????????│
???????????├─model
???????????│ ?????shouru.java??//收入的數(shù)據(jù)結(jié)構(gòu)
???????????│ ?????zhichu.java??//支出的數(shù)據(jù)結(jié)構(gòu)
???????????│
???????????└─view
???????????????????Addoutaccount.java???//添加支出的界面
???????????????????Addshouru.java??// 添加收入的界面
???????????????????ModifyManage.java???//刪除,修改,放棄
???????????????????Login.java??//登錄界面,需要密碼時(shí)啟動(dòng)
???????????????????MainActivity.java??//主界面,顯示主要列表菜單
???????????????????Psdset.java???//密碼修改界面
???????????????????Shouruinfo.java??//收入詳情界面
???????????????????Showinfo.java??//收入和支出界面
???????????????????myAdapter.java??// 顯示表格的適配數(shù)據(jù)
???????????????????tjjg.java???//統(tǒng)計(jì)結(jié)果顯示
???????????????????tjjg_sel.java?//選擇統(tǒng)計(jì)時(shí)間段
???????????????????Zhichutinfo.java//支出的詳細(xì)界面
?
主要代碼流程:
?
啟動(dòng)app,進(jìn)入login.java,里面進(jìn)行判斷,如果是第一次或者密碼為空,直接跳主界面mainactivity.java,否則讓輸入密碼,和正確的密碼進(jìn)行匹配,進(jìn)行判斷,正確進(jìn)入mainactivity.java,否則讓重輸入。
// 獲取到進(jìn)入密碼,如果為空,說(shuō)明是第一次啟動(dòng),直接進(jìn)入主界面。
sp?= getSharedPreferences("default", 0);
psd=sp.getString("psd","");
if(psd==null||psd.equals("")){
startActivity(intent);
finish();
}
?
//點(diǎn)擊登錄按鈕,判斷,如果沒(méi)有輸入任何東西,則提示請(qǐng)輸入密碼后登陸,否則判斷是否和存儲(chǔ)的一致,一致登陸進(jìn)去,否則請(qǐng)重新輸入
btnlogin.setOnClickListener(new?OnClickListener() {
@Override
public?void?onClick(View arg0) {
????String txt=txtlogin.getText().toString();
if(txt.length()==0){
Toast.makeText(Login.this,"請(qǐng)輸入密碼后登陸", Toast.LENGTH_SHORT).show();
}else{
if(txt.equals(psd)){
startActivity(intent);
finish();
}
else{
Toast.makeText(Login.this,"請(qǐng)輸入正確的密碼", Toast.LENGTH_SHORT).show();
}
}
?
txtlogin.setText("");
}
});
Mainactivity.java 顯示主要的菜單項(xiàng):
"新添支出","新添收入","我的支出","我的收入","數(shù)據(jù)中心","統(tǒng)計(jì)結(jié)果","密碼設(shè)置","退出應(yīng)用"
界面顯示用的一個(gè) GridView 和一個(gè)適配器完成界面顯示。
gvinfo=(GridView)findViewById(R.id.gvinfo);
//創(chuàng)建ItemAdapter對(duì)象,加載菜單項(xiàng)
ItemAdapter adapter=new?ItemAdapter(titles,images, this);
gvinfo.setAdapter(adapter);
?
然后設(shè)置點(diǎn)擊item進(jìn)行相應(yīng)界面操作。這個(gè)主界面則顯示完成,流程也很簡(jiǎn)單。
?
gvinfo.setOnItemClickListener(new?OnItemClickListener() {
?
@Override
public?void?onItemClick(AdapterView<?> arg0, View arg1,int?arg2,
long?arg3) {
Intent intent=null;
switch(arg2){
case?0:
//新添支出
intent=new?Intent(MainActivity.this, Addoutaccount.class);
startActivity(intent);
break;
case?1:
//"新添收入"
intent=new?Intent(MainActivity.this, Addshouru.class);
startActivity(intent);
break;
case?2:
//"我的支出"
intent=new?Intent(MainActivity.this, zhichutinfo.class);
startActivity(intent);
break;
case?3:
//"我的收入"
intent=new?Intent(MainActivity.this, shouruinfo.class);
startActivity(intent);
break;
case?4:
//"數(shù)據(jù)中心"
intent=new?Intent(MainActivity.this, showinfo.class);
startActivity(intent);
break;
case?5:
//"統(tǒng)計(jì)結(jié)果"
intent=new?Intent(MainActivity.this, tjjg_sel.class);
startActivity(intent);
break;
case?6:
//"密碼設(shè)置"
intent=new?Intent(MainActivity.this, psdset.class);
startActivity(intent);
break;
case?7:
//"退出應(yīng)用"
finish();
}
?
?
?
先說(shuō)下各個(gè)界面的主要流程,后面是寫(xiě)細(xì)節(jié)東西。
新添支出?新添收入:
輸入金錢(qián),類(lèi)別?,標(biāo)簽 ,時(shí)間 ,地址 信息 ,存儲(chǔ)在db里面。
我的支出 我的收入:
從數(shù)據(jù)庫(kù)取出數(shù)據(jù),顯示支出和收入列表。
數(shù)據(jù)中心:
顯示支出和收入整個(gè)信息,點(diǎn)擊各個(gè)信息,進(jìn)入可以修改的界面,進(jìn)行修改刪除操作。
統(tǒng)計(jì)結(jié)果:
顯示列表,顯示表項(xiàng),計(jì)算各個(gè)項(xiàng)目的花費(fèi)。點(diǎn)擊圖形顯示,則會(huì)以餅狀顯示統(tǒng)計(jì)結(jié)果。
密碼設(shè)置:
可以設(shè)置密碼,登錄時(shí)需要輸入,保證數(shù)據(jù)安全。
退出:直接退出界面。
?
?
?
里面用到的主要還是數(shù)據(jù)庫(kù)操作sqlite 和圖表操作,密碼用的SharedPreferences簡(jiǎn)單存儲(chǔ)。和一些簡(jiǎn)單的代碼邏輯。
?
圖表用的這個(gè)
http://blog.jobbole.com/65102/??很簡(jiǎn)單的使用。
代碼中使用的位置:
CategorySeries dataset=new?CategorySeries("支出信息餅圖");
//持有一個(gè)數(shù)據(jù) dataset?,用來(lái)存儲(chǔ)有多少組項(xiàng)目,標(biāo)題的信息。
// ??從數(shù)據(jù)庫(kù)里面取出來(lái)數(shù)據(jù),將各個(gè)的類(lèi)別名字和錢(qián)數(shù)添加進(jìn)去。
// dataset.add(cursor.getString(0), cursor.getDouble(1));
?
int?count=0;
while(cursor.moveToNext()){
dataset.add(cursor.getString(0), cursor.getDouble(1));
count++;
}
cursor.close();
?
// renderer 是渲染器,設(shè)置下渲染的顏色 標(biāo)記文本字體大小
?????????????????renderer.setApplyBackgroundColor(true);
?????????????renderer.setLabelsTextSize(20);
?????????????renderer.setChartTitleTextSize(30);
?????????????renderer.setLegendTextSize(30);
?????????????renderer.setLegendHeight(50);
?
//給渲染器設(shè)置各個(gè)顏色。
?
?????????????int[] colors=new?int[]{Color.RED,Color.BLUE,Color.GREEN,Color.YELLOW,Color.CYAN,Color.DKGRAY,Color.GRAY,Color.LTGRAY,Color.MAGENTA,Color.TRANSPARENT,Color.WHITE,Color.BLACK,Color.RED, Color.BLUE,Color.CYAN,Color.DKGRAY,Color.GRAY,Color.GREEN,Color.LTGRAY,Color.MAGENTA,Color.TRANSPARENT,Color.WHITE,Color.YELLOW,Color.BLACK};
?????????????for?(int?i=0;i<count;i++) {
????????????????????????// 設(shè)置各個(gè)部分的樣式
??????????????????SimpleSeriesRenderer r = new?SimpleSeriesRenderer();
??????????????????r.setColor(colors[i]);
??????????????????renderer.addSeriesRenderer(r);
?????????????}
?
// ???傳參數(shù),進(jìn)入圖表界面。
Intent intent=ChartFactory.getPieChartIntent(tjjg.this, dataset, renderer,"支出信息餅圖");
startActivity(intent);
?
?
?
?
?
?
?
?
現(xiàn)在我們說(shuō)下各個(gè)界面的代碼:
?
Addoutaccount?新添支出:
主要有 錢(qián)數(shù) 時(shí)間 地點(diǎn) 類(lèi)型 標(biāo)簽
時(shí)間顯示使用
//時(shí)間單擊事件
txtTime.setOnClickListener(new?OnClickListener() {
@Override
public?void?onClick(View arg0) {
// TODO?Auto-generated method stub
showDialog(DATE_DIALOG_ID);
}
});
?
//創(chuàng)建對(duì)應(yīng)的對(duì)話(huà)框DATE_DIALOG_ID)=0,所以會(huì)創(chuàng)建DatePickerDialog?回調(diào)在下方
protected?Dialog onCreateDialog(int?id) {
switch(id){
case?0:
return?new?DatePickerDialog(this,mDateSetLisetener, mYear, mMonth, mDay);
}
return?null;
}
?
?
//回調(diào)函數(shù),將時(shí)間信息更新到界面上即可。
?
private?DatePickerDialog.OnDateSetListenermDateSetLisetener=new?OnDateSetListener() {
@Override
public?void?onDateSet(DatePicker view,int?year, int?month,int?day) {
mYear=year;
mMonth=month;
mDay=day;
updateDisplay();
}
};
?
點(diǎn)擊存儲(chǔ):
?
先判斷錢(qián)寫(xiě)了嗎,沒(méi)有提示請(qǐng)輸入支出金額,否則進(jìn)入,創(chuàng)建一個(gè)支出對(duì)象
,將金錢(qián),時(shí)間,類(lèi)型,地址,標(biāo)注填入。
然后使用outaccountdao.add(tb_outaccount);
加入一條數(shù)據(jù)。這段代碼為:(稍后我們?cè)僦vzhiochuDAO 文件)。
?
?
?
if(txtMoney.getText().toString().isEmpty() ||Double.parseDouble(txtMoney.getText().toString())==0){
Toast.makeText(Addoutaccount.this,"請(qǐng)輸入支出金額", Toast.LENGTH_SHORT).show();
}else{
zhiochuDAO outaccountdao=new?zhiochuDAO(Addoutaccount.this);
zhichu tb_outaccount=new?zhichu(outaccountdao.getMaxId()+1, Double.parseDouble(txtMoney.getText().toString()),txtTime.getText().toString(), spType.getSelectedItem().toString(), txtAddress.getText().toString(),txtMark.getText().toString());
try?{
outaccountdao.add(tb_outaccount);
Toast.makeText(Addoutaccount.this,"【新增支出】數(shù)據(jù)添加成功", Toast.LENGTH_SHORT).show();
finish();
} catch?(Exception e) {
Toast.makeText(Addoutaccount.this,"【新增支出】數(shù)據(jù)添加失敗", Toast.LENGTH_SHORT).show();
}
}
?
現(xiàn)在我們來(lái)說(shuō)zhiochuDAO ?這個(gè)文件的內(nèi)容:
?
構(gòu)造里面用helper=new?DBOpenHelper(context);//初始化DBOpenHelper對(duì)象
?
/**
?* 添加支出信息
?* @param?tb_outaccount
?*/
public?void?add(zhichu tb_outaccount){
db=helper.getWritableDatabase();
//執(zhí)行添加信息操作
db.execSQL("insert into tb_outaccount (_id,money,time,type,address,mark) values (?,?,?,?,?,?)",new?Object[]{tb_outaccount.getid(),tb_outaccount.getMoney(),tb_outaccount.getTime(),tb_outaccount.getType(),tb_outaccount.getAddress(),tb_outaccount.getMark()});
}
?
這里我們說(shuō)下這個(gè)語(yǔ)句的意思。
?
insert into tb_outaccount (_id,money,time,type,address,mark)
插入?????到 ???這個(gè)表格 ???????需要數(shù)據(jù)_id錢(qián)數(shù) 時(shí)間 類(lèi)型 地址 標(biāo)記
?
這些信息從 后面的那個(gè)參數(shù)傳過(guò)來(lái)。
?
?
這里這個(gè)id是
getMaxId()+1??來(lái)的,getMaxId 是獲取支出表格里面的最大的ID值。
?
/**
?* 獲取支出最大編號(hào)
?* @return
?*/
public?int?getMaxId(){
db=helper.getWritableDatabase();
Cursor cursor=db.rawQuery("select max(_id) from tb_outaccount",null);
while(cursor.moveToNext()){
return?cursor.getInt(0);
}
return?0;
}
?
這里這個(gè)select max(_id) from tb_outaccount?意思為,選擇 ?最大的(_id)從 tb_outaccount?這個(gè)表格里面。
?
?
這個(gè)文件里面的所有語(yǔ)句,這里解釋一下:
select count(_id) from tb_outaccount
選擇?數(shù)目(_id) ?從tb_outaccount表格。
?
select * from tb_outaccount order by _id desc limit ?,? ",new?String[]{String.valueOf(start),String.valueOf(count)}
?
選擇?所有 從 tb_outaccount表格?,排序依據(jù)_id遞減?,限制起始點(diǎn) 和個(gè)數(shù)。
?
select _id,money,time,type,address,mark from tb_outaccount where _id=?
?
選擇?需要_id ?錢(qián)數(shù) 時(shí)間 類(lèi)型 地址 標(biāo)簽 從tb_outaccount表格?里面_id 等于 你后面?zhèn)鬟f的參數(shù)。
?
update tb_outaccount set money=?,time=?,type=?,address=?,mark=? where _id=?
?
更新數(shù)據(jù)?tb_outaccount表格??設(shè)置 錢(qián)數(shù) 時(shí)間 類(lèi)型 地址 標(biāo)簽 具體_id=后面的參數(shù)
?
?
?
收入和支出邏輯一樣,只是存儲(chǔ)的表項(xiàng)不一樣而已。
?
?
?
Psdset.java 密碼設(shè)置界面
// 獲取到進(jìn)入密碼,如果為空,說(shuō)明是第一次啟動(dòng),隱藏掉輸入舊密碼,設(shè)置標(biāo)記是否需要判斷舊密碼
sp?= getSharedPreferences("default", 0);
edit=sp.edit();
psd=sp.getString("psd","");
if(psd==null?||psd.equals(""))
{
txtpwd1.setVisibility(View.GONE);
tvPwd1.setVisibility(View.GONE);
isoldpwd=false;
}else
{
isoldpwd=true;
}
?
設(shè)置點(diǎn)擊設(shè)置密碼時(shí),判斷是否有舊密碼,有的話(huà),進(jìn)行判斷,不正確不讓修改。
正確后再次判斷新密碼和新密碼驗(yàn)證是否一致,不一致一樣不設(shè)置,否則設(shè)置,存儲(chǔ)在SharedPreferences里面即可。
如果之前沒(méi)有舊密碼,直接判斷兩次的新密碼是否一樣,一樣存儲(chǔ)即可,否則提示重新輸入。
總結(jié)
以上是生活随笔為你收集整理的一个毕业设计 家庭理财app的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 51单片机汇编语言实验(三)-----定
- 下一篇: G470 deepin wifi无法开启