首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android 范例-个人理财工具 之三 添加账单页面A

2012-08-22 
Android 实例-个人理财工具 之三 添加账单页面A键字:android sdk1.0 sqlite intent ExpandableListActivit

Android 实例-个人理财工具 之三 添加账单页面A

键字:android sdk1.0 sqlite intent ExpandableListActivity SimpleCursorTreeAdapter cursor custom dialog

?

ColaBox 登记收支记录终于进入了复杂阶段了.这个界面我也是查找了很多资料以及打开android的源代码看了后才完成了,现在想来Google的开源真是明智的啊.

?

从前面的登录页面跳转进入添加账单页面.这个页面主要是用来登记收支记录的.

说白了就是往数据库录入明细.

?

表结构就是db.execSQL("CREATE TABLE bills ("
???????????????? + "_ID INTEGER PRIMARY KEY," //id
???????????????? + "fee integer,"???????????????????????????????????? //费用

???????????????? +"acctitemid integer,"????????????????????????? //账目类型
???????????????? + "userid integer,"??????????????????????????????? //使用者
???????????????? + "sdate TEXT,"???????????????????????????????? //日期
???????????????? + "stime TEXT,"??????????????????????????????? //时间
???????????????? + "desc TEXT"????????????????????????????????? //备注
???????????????? + ");");

?

可以看到主要是录入这些数据.首先是布置界面,我目前想到的用个tablelayout来布局

最后布局就是如下图这样

?

图1

Android 范例-个人理财工具 之三 添加账单页面A

?

在这儿我首先需要设置账目,前面我们已经初始化过账目的数据.

账目应该是一个ExpandableListActivity 2层的结构.需要从数据库里面读取.我在账目后面放了一个editview 只读没有光标的.也就是在这儿不可录入,在该editview的onclick事件里面我们打开账目选择界面.如下图

?

图2 账目选择

Android 范例-个人理财工具 之三 添加账单页面A

?

在这个界面中点击子节点就返回前面界面,把选择的账目传递过去.在这有个问题,如果用户需要录入的账目没有怎么办?

所以我这没有用dialog方式而是用了ExpandableListActivity? 在这个界面中如果长点某个子节点就弹出管理账目菜单,

来维护账目,如下图所示:

图3账目选择菜单示意????????????????????????????????????????????????????????????????????图4 编辑账目

Android 范例-个人理财工具 之三 添加账单页面AAndroid 范例-个人理财工具 之三 添加账单页面A

?

?上面这些流程说起来很简单,可是当我用andriod编写时,遇到了很多问题,不过一个个都被我解决了,这正是编程的快乐所在.

关于ExpandableListActivity 大家可以参考android 里面apidemos 里面ExpandableList1,ExpandableList2,ExpandableList3

这里面对熟悉这个ui还是很有帮助的. 在ExpandableList2 里面就是从数据库进行读取的例子. 当然android里面那个我是没太

看明白因为他引用了import android.provider.Contacts.People; 联系人部分的框架,而我目前对数据库的操作和他不一样,我都是直接

sql访问.

但是你只要搞定2个cursor就ok了. Cursor groupCursor childCursor 其他都由SimpleCursorTreeAdapter帮你实现了.

下面我们来看看如何使用SimpleCursorTreeAdapter

?
??? }
???
??? public Cursor getChildenNode(String pid){
??? ?Log.v("cola","run getchildenNode");
?? ??return db.query("acctitem", new String[]{"_id", "name" }, "pid="+pid, null, null, null, "_id");???????? }只要这几步一个2级的tree list就可以出现了.

上面其实才是刚开始,后面我们需要使用一个自定义的Dialog 类似于一个inputBox 因为我们新增账目是需要输入账目的名称.

就是上面图4表现的.

虽然alertDialog提供了很多方法,可以选择list,treelist,radio, 可惜就是不能录入text.

这里我参考了api demos 里面的 DateWidgets1.java 和源代码里面DatePickerDialog.java .

我们可以从alertdialog 继承.然后添加一个Editview 最后把数据返回出来.只要把上面我说的2个java看清楚了后处理起来就简单了.

主要是一个回调函数的用法.下面看代码

    //
  1. public?class?Dialog_edit?extends?AlertDialog?implements?OnClickListener?{????private?String?text?=?"";
  2. ????private?EditText?edit;????private?OnDateSetListener?mCallback; //定义回调函数
  3. ????private?LinearLayout?layout;
  4. ????public?interface?OnDateSetListener?{? //回调接口
  5. ????????void?onDateSet(String?text);
  6. ????}
  7. ????protected?Dialog_edit(Context?context,?String?title,?String?value,????????????OnDateSetListener?Callback)?{
  8. ????????super(context);????????mCallback?=?Callback;
  9. ????????TextView?label?=?new?TextView(context);????????label.setText("hint");
  10. ????????//?setView(label); ????????edit?=?new?EditText(context);
  11. ????????edit.setText(value);????????layout?=?new?LinearLayout(context);
  12. ????????layout.setOrientation(LinearLayout.VERTICAL);????????//?LinearLayout.LayoutParams?param?=
  13. ????????//?new?LinearLayout.LayoutParams(100,?40); ????????//?layout.addView(label,?param);
  14. ????????LinearLayout.LayoutParams?param2?=?new?LinearLayout.LayoutParams(200,????????????????50);
  15. ????????layout.addView(edit,?param2);
  16. ?????? //添加edit????????setView(layout);
  17. ????????setTitle(title);????????setButton("确定",?this);
  18. ????????setButton2("取消",?(OnClickListener)?null);
  19. ????}
  20. ????public?void?onClick(DialogInterface?dialog,?int?which)?{????????//?Log.v("cola","U?click?which="+which);
  21. ????????text?=?edit.getText().toString();????????Log.v("cola",?"U?click?text="?+?text);
  22. ????????if?(mCallback?!=?null)????????????mCallback.onDateSet(text);? //使用回调返回录入的数据
  23. ????}
  24. }

这样我们就完成了自定义的dialog 我们可以使用它来新增和编辑账目. 对于账目的增删改就是sql的事情了

在这我又遇到一个问题就是我新增一个账目后如何来刷新界面,从而反映账目修改后的变化

在这我开始以为只要使用getExpandableListView().invalidate(); 就可以了,

因为我之前在ExpandableList1.java例子里面,使用它可以刷新界面.

在那个例子里面我修改了数组后调用该方法,界面就刷新了,而在这SimpleCursorTreeAdapter就行不通了,我想

应该只要刷新cursor应该就可以了,后来找到了notifyDataSetChanged 呵呵,果然可以了. 这样账目的录入和管理就搞定了.

?

下面给出目前最新的代码.

首先是账目管理

  1. package?com.cola.ui;
  2. import?android.app.AlertDialog;
  3. import?android.app.ExpandableListActivity;import?android.content.Context;
  4. import?android.content.DialogInterface;import?android.content.Intent;
  5. import?android.database.Cursor;import?android.os.Bundle;
  6. import?android.provider.Contacts.People;import?android.util.Log;
  7. import?android.view.ContextMenu;import?android.view.MenuItem;
  8. import?android.view.View;import?android.view.ContextMenu.ContextMenuInfo;
  9. import?android.widget.ExpandableListAdapter;import?android.widget.ExpandableListView;
  10. import?android.widget.SimpleCursorTreeAdapter;import?android.widget.TextView;
  11. import?android.widget.ExpandableListView.ExpandableListContextMenuInfo;
  12. /**?*?Demonstrates?expandable?lists?backed?by?Cursors
  13. ?*/public?class?Frm_Editacctitem?extends?ExpandableListActivity?{
  14. ????private?int?mGroupIdColumnIndex;
  15. ????private?String?mPhoneNumberProjection[]?=?new?String[]?{?People.Phones._ID,????????????People.Phones.NUMBER?};
  16. ????private?ExpandableListAdapter?mAdapter;
  17. ????BilldbHelper?billdb;
  18. ????Dialog_edit?newdialog;
  19. ????????
  20. ????private?ExpandableListContextMenuInfo?info;
  21. ????????
  22. ????@Override????public?void?onCreate(Bundle?savedInstanceState)?{
  23. ????????super.onCreate(savedInstanceState);????????setTitle("ColaBox-选择账目");
  24. ????????billdb?=?new?BilldbHelper(this);
  25. ????????//?Query?for?people ????????Cursor?groupCursor?=?billdb.getParentNode();
  26. ????????//?Cache?the?ID?column?index
  27. ????????mGroupIdColumnIndex?=?groupCursor.getColumnIndexOrThrow("_ID");????????//?Set?up?our?adapter
  28. ????????mAdapter?=?new?MyExpandableListAdapter(groupCursor,?this,????????????????android.R.layout.simple_expandable_list_item_1,
  29. ????????????????android.R.layout.simple_expandable_list_item_1,????????????????new?String[]?{?"NAME"?},?//?Name?for?group?layouts
  30. ????????????????new?int[]?{?android.R.id.text1?},?new?String[]?{?"NAME"?},?// ????????????????new?int[]?{?android.R.id.text1?});
  31. ????????setListAdapter(mAdapter);????????registerForContextMenu(getExpandableListView());
  32. ????}
  33. ????????@Override
  34. ????public?boolean?onChildClick(ExpandableListView?parent,?View?v,?int?groupPosition,?int?childPosition,?long?id)????{
  35. ????????Bundle?bundle?=?new?Bundle();????????bundle.putString("DataKey",?((TextView)v).getText().toString());//给bundle?写入数据
  36. ????????Intent?mIntent?=?new?Intent();????????mIntent.putExtras(bundle);
  37. ????????setResult(RESULT_OK,?mIntent);????????billdb.close();
  38. ????????finish();?
  39. ????????return?true;????????}
  40. ????@Override????public?void?onCreateContextMenu(ContextMenu?menu,?View?v,
  41. ????????????ContextMenuInfo?menuInfo)?{????????super.onCreateOptionsMenu(menu);
  42. ????????if?(ExpandableListView????????????????.getPackedPositionType(((ExpandableListContextMenuInfo)?menuInfo).packedPosition)?==?1)?{
  43. ????????????Log.v("cola",?"run?menu");????????????menu.setHeaderTitle("菜单");
  44. ????????????menu.add(0,?1,?0,?"新?增");????????????menu.add(0,?2,?0,?"删?除");
  45. ????????????menu.add(0,?3,?0,?"编?辑");????????}
  46. ????}
  47. ????@Override
  48. ????public?boolean?onContextItemSelected(MenuItem?item)?{????????info?=?(ExpandableListContextMenuInfo)?item.getMenuInfo();
  49. ????????if?(item.getItemId()?==?1)?{
  50. ????????????//?Log.v("cola","id"+info.id); ????????????newdialog?=?new?Dialog_edit(this,?"请输入新增账目的名称",?"",
  51. ????????????????????mDialogClick_new);????????????newdialog.show();
  52. ????????}?else?if?(item.getItemId()?==?2)?{????????????new?AlertDialog.Builder(this).setTitle("提示").setMessage("确定要删除'"+((TextView)info.targetView).getText().toString()+"'这个账目吗?")
  53. ????????????????????.setIcon(R.drawable.quit).setPositiveButton("确定",????????????????????????????new?DialogInterface.OnClickListener()?{
  54. ????????????????????????????????public?void?onClick(DialogInterface?dialog,????????????????????????????????????????int?whichButton)?{
  55. ????????????????????????????????????billdb.Acctitem_delitem((int)info.id);????????????????????????????????????updatedisplay();
  56. ????????????????????????????????}????????????????????????????}).setNegativeButton("取消",
  57. ????????????????????????????new?DialogInterface.OnClickListener()?{????????????????????????????????public?void?onClick(DialogInterface?dialog,
  58. ????????????????????????????????????????int?whichButton)?{????????????????????????????????????//?取消按钮事件
  59. ????????????????????????????????}????????????????????????????}).show();
  60. ????????}?else?if?(item.getItemId()?==?3)?{
  61. ????????????newdialog?=?new?Dialog_edit(this,?"请修改账目名称",????????????????????((TextView)?info.targetView).getText().toString(),
  62. ????????????????????mDialogClick_edit);????????????newdialog.show();
  63. ????????}
  64. ????????return?false;????}
  65. ????private?Dialog_edit.OnDateSetListener?mDialogClick_new?=?new?Dialog_edit.OnDateSetListener()?{
  66. ????????public?void?onDateSet(String?text)?{????????????Log.v("cola",?"new?acctitem");
  67. ????????????billdb.Acctitem_newitem(text,ExpandableListView.getPackedPositionGroup(info.packedPosition));????????????updatedisplay();
  68. ????????}
  69. ????};????
  70. ????private?Dialog_edit.OnDateSetListener?mDialogClick_edit?=?new?Dialog_edit.OnDateSetListener()?{????????public?void?onDateSet(String?text)?{????????????
  71. ????????????billdb.Acctitem_edititem(text,(int)info.id);????????????updatedisplay();
  72. ????????}
  73. ????};
  74. ????private?void?updatedisplay(){????????Log.v("cola",?"update?display");
  75. ????????((MyExpandableListAdapter)mAdapter).notifyDataSetChanged();
  76. ????}????
  77. ????public?class?MyExpandableListAdapter?extends?SimpleCursorTreeAdapter?{
  78. ????????public?MyExpandableListAdapter(Cursor?cursor,?Context?context,????????????????int?groupLayout,?int?childLayout,?String[]?groupFrom,
  79. ????????????????int[]?groupTo,?String[]?childrenFrom,?int[]?childrenTo)?{????????????super(context,?cursor,?groupLayout,?groupFrom,?groupTo,
  80. ????????????????????childLayout,?childrenFrom,?childrenTo);????????}
  81. ????????@Override
  82. ????????protected?Cursor?getChildrenCursor(Cursor?groupCursor)?{
  83. ????????????String?pid?=?groupCursor.getLong(mGroupIdColumnIndex)?+?"";????????????//?Log.v("cola","pid="+pid);
  84. ????????????return?billdb.getChildenNode(pid);
  85. ????????}
  86. ????????@Override????????public?long?getGroupId(int?groupPosition)?{
  87. ????????????//?Log.v("cola",?"getGroupId?"?+?groupPosition); ????????????Cursor?groupCursor?=?(Cursor)?getGroup(groupPosition);
  88. ????????????return?groupCursor.getLong(mGroupIdColumnIndex);????????}
  89. ????????@Override
  90. ????????public?long?getChildId(int?groupPosition,?int?childPosition)?{????????????//?Log.v("cola",?"getChildId?"?+?groupPosition?+?","?+
  91. ????????????//?childPosition); ????????????Cursor?childCursor?=?(Cursor)?getChild(groupPosition,?childPosition);
  92. ????????????return?childCursor.getLong(0);????????}
  93. ????}
  94. }

自定义对话框

  1. package?com.cola.ui;
  2. import?android.app.AlertDialog;
  3. import?android.content.Context;import?android.content.DialogInterface;
  4. import?android.content.DialogInterface.OnClickListener;import?android.util.Log;
  5. import?android.widget.EditText;import?android.widget.LinearLayout;
  6. import?android.widget.TextView;
  7. public?class?Dialog_edit?extends?AlertDialog?implements?OnClickListener?{
  8. ????private?String?text?=?"";????private?EditText?edit;
  9. ????private?OnDateSetListener?mCallback;
  10. ????private?LinearLayout?layout;
  11. ????public?interface?OnDateSetListener?{
  12. ????????void?onDateSet(String?text);????}
  13. ????protected?Dialog_edit(Context?context,?String?title,?String?value,
  14. ????????????OnDateSetListener?Callback)?{????????super(context);
  15. ????????mCallback?=?Callback;????????TextView?label?=?new?TextView(context);
  16. ????????label.setText("hint");????????//?setView(label);
  17. ????????edit?=?new?EditText(context);????????edit.setText(value);
  18. ????????layout?=?new?LinearLayout(context);????????layout.setOrientation(LinearLayout.VERTICAL);
  19. ????????//?LinearLayout.LayoutParams?param?= ????????//?new?LinearLayout.LayoutParams(100,?40);
  20. ????????//?layout.addView(label,?param); ????????LinearLayout.LayoutParams?param2?=?new?LinearLayout.LayoutParams(200,
  21. ????????????????50);????????layout.addView(edit,?param2);
  22. ????????setView(layout);????????setTitle(title);
  23. ????????setButton("确定",?this);????????setButton2("取消",?(OnClickListener)?null);
  24. ????}
  25. ????public?void?onClick(DialogInterface?dialog,?int?which)?{
  26. ????????//?Log.v("cola","U?click?which="+which); ????????text?=?edit.getText().toString();
  27. ????????Log.v("cola",?"U?click?text="?+?text);????????if?(mCallback?!=?null)
  28. ????????????mCallback.onDateSet(text);
  29. ????}
  30. }

数据库管理代码

    package?com.cola.ui;
  1. import?android.content.Context;
  2. import?android.database.Cursor;import?android.database.sqlite.SQLiteDatabase;
  3. import?android.util.Log;
  4. /**?*?Provides?access?to?a?database?of?notes.?Each?note?has?a?title,?the?note
  5. ?*?itself,?a?creation?date?and?a?modified?data.?*/
  6. public?class?BilldbHelper?{
  7. ????private?static?final?String?TAG?=?"Cola_BilldbHelper";
  8. ????private?static?final?String?DATABASE_NAME?=?"cola.db";????
  9. ????SQLiteDatabase?db;????Context?context;
  10. ????????BilldbHelper(Context?_context)?{
  11. ????????context=_context;????????db=context.openOrCreateDatabase(DATABASE_NAME,?0,?null);?
  12. ????????Log.v(TAG,"db?path="+db.getPath());????}
  13. ????????public?void?CreateTable_acctitem()?{
  14. ????????try{????????????db.execSQL("CREATE?TABLE?acctitem?("
  15. ????????????????????+?"_ID?INTEGER?PRIMARY?KEY,"????????????????????+?"PID?integer,"
  16. ????????????????????+?"NAME?TEXT"???????????????????????????????????+?");");
  17. ????????????Log.v("cola","Create?Table?acctitem?ok");????????}catch(Exception?e){
  18. ????????????Log.v("cola","Create?Table?acctitem?err,table?exists.");????????}
  19. ????}????
  20. ????public?void?CreateTable_bills()?{????????try{
  21. ????????????db.execSQL("CREATE?TABLE?bills?("????????????????????+?"_ID?INTEGER?PRIMARY?KEY,"
  22. ????????????????????+"?acctitemid?integer,"???????????????????????+?"fee?integer,"
  23. ????????????????????+?"userid?integer,"????????????????????+?"sdate?TEXT,"
  24. ????????????????????+?"stime?TEXT,"????????????????????+?"desc?TEXT"????????????????
  25. ????????????????????+?");");????????????
  26. ????????????Log.v("cola","Create?Table?acctitem?ok");????????}catch(Exception?e){
  27. ????????????Log.v("cola","Create?Table?acctitem?err,table?exists.");????????}
  28. ????}????
  29. ????public?void?CreateTable_colaconfig()?{????????try{
  30. ????????????db.execSQL("CREATE?TABLE?colaconfig?("????????????????????+?"_ID?INTEGER?PRIMARY?KEY,"
  31. ????????????????????+?"NAME?TEXT"????????????????????????????????+?");");
  32. ????????????Log.v("cola","Create?Table?colaconfig?ok");????????}catch(Exception?e){
  33. ????????????Log.v("cola","Create?Table?acctitem?err,table?exists.");????????}
  34. ????}????
  35. ????public?void?InitAcctitem()?{????????try{
  36. ??????????//s.getBytes(encoding); ??????????db.execSQL("insert?into?acctitem?values?(1,null,'收入')");
  37. ??????????db.execSQL("insert?into?acctitem?values?(2,1,'工资')");??????????db.execSQL("insert?into?acctitem?values?(9998,1,'其他')");
  38. ??????????db.execSQL("insert?into?acctitem?values?(0,null,'支出')");??????????db.execSQL("insert?into?acctitem?values?(3,0,'生活用品')");
  39. ??????????db.execSQL("insert?into?acctitem?values?(4,0,'水电煤气费')");??????????db.execSQL("insert?into?acctitem?values?(5,0,'汽油费')");
  40. ??????????db.execSQL("insert?into?acctitem?values?(9999,0,'其他')");??????????
  41. ??????????//db.execSQL("insert?into?bills?values(100,135,10000,'','','备注')"); ??????????Log.v("cola","insert?into?ok");?
  42. ????????}catch(Exception?e)????????{
  43. ????????????Log.v("cola","init?acctitem?e="+e.getMessage());????????}
  44. ????????????}
  45. ????public?void?Acctitem_newitem(String?text,int?type){????????
  46. ????????Cursor?c?=db.query("acctitem",?new?String[]{"max(_id)+1"},?"_id?is?not?null?and?_id<9998",?null,?null,?null,?null);????????c.moveToFirst();
  47. ????????int?maxid=c.getInt(0);??????????????String?sql="insert?into?acctitem?values?("+maxid+","+type+",'"+text+"')";
  48. ????????db.execSQL(sql);????????Log.v("cola","newitem?ok?text="+text+"?id="+type+"?sql="+sql);
  49. ????????????}
  50. ????????public?void?Acctitem_edititem(String?text,int?id){??????
  51. ????????db.execSQL("update?acctitem?set?name='"+text+"'?where?_id="+id);????????Log.v("cola","edititem?ok?text="+text+"?id="+id);
  52. ????}????
  53. ????public?void?Acctitem_delitem(int?id){????????
  54. ????????db.execSQL("delete?from?acctitem?where?_id="+id);????????Log.v("cola","delitem?ok?id="+id);
  55. ????}????
  56. ????public?void?QueryTable_acctitem(){????????
  57. ????}????
  58. ????public?void?FirstStart(){????????try{
  59. ????????????String?col[]?=?{"type",?"name"?};????????????Cursor?c?=db.query("sqlite_master",?col,?"name='colaconfig'",?null,?null,?null,?null);
  60. ????????????int?n=c.getCount();????????????if?(c.getCount()==0){
  61. ????????????????CreateTable_acctitem();????????????????CreateTable_colaconfig();
  62. ????????????????CreateTable_bills();????????????????InitAcctitem();?????????
  63. ????????????}???????????????????????//getTree();????????????
  64. ????????????Log.v("cola","c.getCount="+n+"");????????????????????
  65. ????????????????????}catch(Exception?e){
  66. ????????????Log.v("cola","e="+e.getMessage());????????}
  67. ????????????????
  68. ????}????
  69. ????????public?void?close(){
  70. ????????db.close();????}
  71. ????????public?Cursor?getParentNode(){
  72. ????????return?db.query("acctitem",?new?String[]{"_id",?"name"?},?"pid?is?null",?null,?null,?null,?"pid,_id");????????
  73. ????}????
  74. ????public?Cursor?getChildenNode(String?pid){????????Log.v("cola","run?getchildenNode");
  75. ????????return?db.query("acctitem",?new?String[]{"_id",?"name"?},?"pid="+pid,?null,?null,?null,?"_id");?????
  76. ????}???}

?

这段代码搞了2个通宵.昨天晚上又被ubuntu 8.04和vmware 5.5 折腾死.我的周末就这样泡汤了.

##############################################

2008-11-23 01:43 湖北武汉

?

?

?

##############################################

备注:

????? 今天看了下android的dialog例子,发现android 带了可输入文字的dialog例子,呵呵,实际上和我自定义的方法就是类似的.

我之前还是demo看的太少了,也就不会走弯路了.

????? 具体可以看AlertDialogSamples.java

热点排行