一、需求分析
在我们生活中经常不知道钱花在什么地方,但是我们自己又不是很想写在记账本上进行管理,由于智能手机的兴起,手机离我们越来越近,导致我们生活时时刻刻都有手机的存在,所以说手机的操作离我们越来越近,趋势越来越明显。但是对于记账,我们往往每个人都有自己的需求,所以对于自己来说,开发一个简单的软件来记账是个非常好玩且有趣的事情。
所以自己趁着学习Android开发的机会,顺便做一个练习项目,本人小白,一开始啥都不懂,但是我有一颗不断学习的心,相信只要自己努力,怎能够作出自己的事业。
我就简单的分析自己需求,对于衣食住行进行分类,然后记录每天的时间,记录下消费的原因,最为重要的就是金额了。总会做个账单统计,分析自己当前的支出和收入,离预算还有多少钱花费。
二、设计界面
账户界面:
记账界面:
功能区界面:
账单显示界面:
补充:功能区实现的功能目前有:记一笔,账单,导出数据,同步数据,其他功能待实现,其实我本人还想做个计一划的实现,实现记账和日常安排计划同时实现。
三、程序设计
由于高仿微信的界面的实现,所有用了Fragment的布局,滑动切换界面,点击功能区按钮来实现对应功能的添加。
这里面用到的技术主要有ListView,Fragment+viewpage,Activity,sqlite数据库技术,还有Post传参来实现同步服务器端的数据。由于服务端框架接触的少,所以功能只有同步数据。同步数据用到了service实现和操作excel技术。
四、代码实现
首先介绍主界面的实现:Fragment+activity布局
MainActivity.java
package com.bank;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity implements View.OnClickListener {
private View.OnClickListener onclicklistene;
private ViewPager mViewPager;
private FragmentPagerAdapter mAdapter;
private List<Fragment> mFragments = new ArrayList<Fragment>();
/**
* 底部四个按钮
*/
private LinearLayout mTabBtnWeixin;
private LinearLayout mTabBtnFrd;
private LinearLayout mTabBtnAddress;
private LinearLayout mTabBtnSettings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
initView();
findViewById(R.id.btn_tab_bottom_weixin).setOnClickListener(this);
findViewById(R.id.btn_tab_bottom_contact).setOnClickListener(this);
findViewById(R.id.btn_tab_bottom_friend).setOnClickListener(this);
findViewById(R.id.btn_tab_bottom_setting).setOnClickListener(this);
mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public int getCount() {
return mFragments.size();
}
@Override
public Fragment getItem(int arg0) {
return mFragments.get(arg0);
}
};
mViewPager.setAdapter(mAdapter);
mViewPager.addOnPageChangeListener(new OnPageChangeListener() {
private int currentIndex;
@Override
public void onPageSelected(int position) {
resetTabBtn();
switch (position) {
case 0:
((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
.setImageResource(R.drawable.tab_weixin_pressed);
break;
case 1:
((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
.setImageResource(R.drawable.tab_find_frd_pressed);
break;
case 2:
((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
.setImageResource(R.drawable.tab_address_pressed);
break;
case 3:
((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
.setImageResource(R.drawable.tab_settings_pressed);
break;
}
currentIndex = position;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
protected void resetTabBtn() {
((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
.setImageResource(R.drawable.tab_weixin_normal);
((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
.setImageResource(R.drawable.tab_find_frd_normal);
((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
.setImageResource(R.drawable.tab_address_normal);
((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
.setImageResource(R.drawable.tab_settings_normal);
}
private void initView() {
mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
FragmentAccount fragmentaccount = new FragmentAccount();
FragmentFind fragmentfind = new FragmentFind();
FragmentPlan fragmentplan = new FragmentPlan();
// MainTab02 tab02 = new MainTab02();
// FragmentBills fragmentbills = new FragmentBills();
MainTab04 tab04 = new MainTab04();
mFragments.add(fragmentaccount);
mFragments.add(fragmentplan);
mFragments.add(fragmentfind);
mFragments.add(tab04);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_tab_bottom_weixin:
mViewPager.setCurrentItem(0, true);
break;
case R.id.btn_tab_bottom_friend:
mViewPager.setCurrentItem(1, true);
break;
case R.id.btn_tab_bottom_contact:
mViewPager.setCurrentItem(2, true);
break;
case R.id.btn_tab_bottom_setting:
mViewPager.setCurrentItem(3, true);
break;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
接下来就是Fragment的实现,我一开始测试中用了4个Fragment来实现,由于有些还需要添加新的功能,所以第一版还是有些挫和部分功能还没有实现。
FragmentAccount.java
package com.bank;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.text.DecimalFormat;
public class FragmentAccount extends Fragment {
private MySQLiteHelper mMysql;
private SQLiteDatabase mDataBase;
private TextView textRemainder,textPay,textIncome;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.finance_check, container, false);
double resultIncome = 0,resultRemainder = 0,resultPay = 0;
textIncome = (TextView)view.findViewById(R.id.textincome);
textRemainder = (TextView)view.findViewById(R.id.textremainder);
textPay = (TextView)view.findViewById(R.id.textpay);
mMysql = new MySQLiteHelper(getActivity(), "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
// String sql = "select Fee from finance where Budget='支出'";//Cursor cursor = mDataBase.query("finance", null, null, null, null, null, null);
// Cursor cursor = mDataBase.query("finance", new String[]{"Fee"},"where Budget=?",new String[]{"支出"},null,null,null);
// String sql ="insert into finance('Type','Time','Fee','Remarks','Budget') values('衣','20160330',37.6,'买衣服','支出')";
// int i =0;
// while( i<20)
// {
// mDataBase.execSQL(sql);
// i++;
// }
Cursor cursor = mDataBase.rawQuery("select Fee,Budget from finance",null);
cursor.moveToFirst();
if (cursor.getCount() > 0) {
for (int i = 0; i < cursor.getCount(); i++) {
// cursor.move(i);
//移动到指定记录
double Fee = cursor.getDouble(cursor.getColumnIndex("Fee"));
String budget = cursor.getString(cursor.getColumnIndex("Budget"));
if(budget.equals("支出")) {
resultPay += Fee;
} else if (budget.equals("收入")){
resultIncome += Fee;
}
cursor.moveToNext();
}
}
DecimalFormat df = new DecimalFormat("###.##");
textPay.setText(String.valueOf(df.format(resultPay)));
textIncome.setText(String.valueOf(df.format(resultIncome)));
textRemainder.setText(String.valueOf(df.format(resultIncome - resultPay)));
cursor.close();
mDataBase.close();
mMysql.close();
return view;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
FragmentFind.java
package com.bank;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Vibrator;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.Toast;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import android.database.sqlite.SQLiteDatabase;
public class FragmentFind extends Fragment implements View.OnClickListener {
private FrameLayout frameLayout_recorder;
private FrameLayout frameLayout_bills;
private FrameLayout frameLayout_test;
private FrameLayout frameLayout_plan;
private FrameLayout frameLayout_SubmitData;
private FrameLayout frameLayout_ExportData;
//数据库
private MySQLiteHelper mMysql;
private SQLiteDatabase mDataBase;
//震动的类
private Vibrator vibrator;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.deal_data, container, false);
frameLayout_recorder = (FrameLayout) view.findViewById(R.id.frameLayoutRecorder);
frameLayout_bills = (FrameLayout) view.findViewById(R.id.frameLayoutStream);
frameLayout_test = (FrameLayout) view.findViewById(R.id.frameLayoutBalance);
frameLayout_plan = (FrameLayout) view.findViewById(R.id.frameLayoutPlan);
frameLayout_SubmitData = (FrameLayout) view.findViewById(R.id.frameLayoutSubmitdata);
frameLayout_ExportData = (FrameLayout) view.findViewById(R.id.frameLayoutExportdata);
frameLayout_test.setOnClickListener(this);
frameLayout_bills.setOnClickListener(this);
frameLayout_recorder.setOnClickListener(this);
frameLayout_plan.setOnClickListener(this);
frameLayout_SubmitData.setOnClickListener(this);
frameLayout_ExportData.setOnClickListener(this);
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.frameLayoutRecorder:
Intent intent = new Intent(getActivity(), RecorderActivity.class);
startActivity(intent);
break;
case R.id.frameLayoutStream:
startActivity(new Intent(getActivity(), BillsActivity.class));
break;
case R.id.frameLayoutBalance:
final int SHOW_INFO = 1;
Intent testintent = new Intent(getActivity(), TestActivity.class);
Bundle bundle = new Bundle();
//传递name参数为tinyphp
bundle.putString("Type", "其他");
bundle.putString("Time", "2016-05-21");
bundle.putString("Budget", "收入");
bundle.putDouble("Fee", 12.5);
bundle.putInt("ID", 12);
bundle.putString("Remarks", "现金交易");
testintent.putExtras(bundle);
startActivityForResult(testintent, SHOW_INFO);
break;
case R.id.frameLayoutPlan:
//消息通知栏
//定义NotificationManager
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getActivity().getSystemService(ns);
//定义通知栏展现的内容信息
int icon = R.drawable.back;
CharSequence tickerText = "通知栏";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
//定义下拉通知栏时要展现的内容信息
Context context = getActivity().getApplicationContext();
CharSequence contentTitle = "已经完成同步";
CharSequence contentText = "进入程序查看详情";
Intent notificationIntent = new Intent(getActivity(), MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(getActivity(), 0,
notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText,
contentIntent);
//用mNotificationManager的notify方法通知用户生成标题栏消息通知
mNotificationManager.notify(1, notification);
startActivity(new Intent(getActivity(), PlanActivity.class));
break;
case R.id.frameLayoutSubmitdata:
Toast.makeText(getActivity(), "正在同步", Toast.LENGTH_SHORT).show();
Intent dataintent = new Intent();
dataintent.setClass(getActivity(), SubmitDataService.class);
getActivity().startService(dataintent);
break;
case R.id.frameLayoutExportdata:
Toast.makeText(getActivity(),"正在导出数据",Toast.LENGTH_SHORT).show();
ExportData();
break;
default:
break;
}
}
public void ExportData() {
String outputFile = "finance.xls";
try {
// 判断是否存在SD卡
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
} else {
Toast.makeText(getActivity(), "sd卡不存在", Toast.LENGTH_LONG).show();
return;
}
String sdCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Finance/";
File file = new File(sdCardRoot + outputFile);
// 创建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
// 如要新建一名为"效益指标"的工作表,其语句为:
// HSSFSheet sheet = workbook.createSheet("效益指标");
HSSFSheet sheet = workbook.createSheet("消费记录");
// 在索引0的位置创建行(最顶端的行)
HSSFRow row = sheet.createRow((short) 0);
//创建表头
HSSFCell IDCell = row.createCell(0);
IDCell.setCellType(HSSFCell.CELL_TYPE_STRING);
IDCell.setCellValue("ID(ID号)");
HSSFCell TypeCell = row.createCell(1);
TypeCell.setCellType(HSSFCell.CELL_TYPE_STRING);
TypeCell.setCellValue("Type(类型)");
HSSFCell TimeCell = row.createCell(2);
TimeCell.setCellType(HSSFCell.CELL_TYPE_STRING);
TimeCell.setCellValue("Time(时间)");
HSSFCell FeeCell = row.createCell(3);
FeeCell.setCellType(HSSFCell.CELL_TYPE_STRING);
FeeCell.setCellValue("Fee(费用)");
HSSFCell RemarksCell = row.createCell(4);
RemarksCell.setCellType(HSSFCell.CELL_TYPE_STRING);
RemarksCell.setCellValue("Remarks(备注)");
HSSFCell BudgetCell = row.createCell(5);
BudgetCell.setCellType(HSSFCell.CELL_TYPE_STRING);
BudgetCell.setCellValue("Budget(收支)");
mMysql = new MySQLiteHelper(getActivity(), "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
Cursor cursor = mDataBase.rawQuery("select * from finance", null);
cursor.moveToFirst();
int columnsSize = cursor.getColumnCount();
int number = 0;
while (number < cursor.getCount()) {
String budget = cursor.getString(cursor.getColumnIndex("Budget"));
int ID = cursor.getInt(cursor.getColumnIndex("ID"));
Double Fee = cursor.getDouble(cursor.getColumnIndex("Fee"));
String Time = cursor.getString(cursor.getColumnIndex("Time"));
String Remarks = cursor.getString(cursor.getColumnIndex("Remarks"));
String Type = cursor.getString(cursor.getColumnIndex("Type"));
row = sheet.createRow(number + 1);
for (int i = 0; i < 6; i++) {
IDCell = row.createCell(i);
IDCell.setCellType(HSSFCell.CELL_TYPE_STRING);
switch (i) {
case 0:
IDCell.setCellValue(ID);
break;
case 1:
IDCell.setCellValue(Type);
break;
case 2:
IDCell.setCellValue(Time);
break;
case 3:
IDCell.setCellValue(Fee);
break;
case 4:
IDCell.setCellValue(Remarks);
break;
case 5:
IDCell.setCellValue(budget);
break;
default:
break;
}
}
cursor.moveToNext();
number++;
}
cursor.close();
mDataBase.close();
mMysql.close();
// 新建一输出文件流
FileOutputStream fOut = new FileOutputStream(sdCardRoot + outputFile);
// 把相应的Excel 工作簿存盘
workbook.write(fOut);
fOut.flush();
// 操作结束,关闭文件
fOut.close();
workbook.close();
//消息通知栏
//定义NotificationManager
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getActivity().getSystemService(ns);
//定义通知栏展现的内容信息
int icon = R.drawable.back;
CharSequence tickerText = "通知栏";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
//定义下拉通知栏时要展现的内容信息
Context context = getActivity().getApplicationContext();
CharSequence contentTitle = "已经导出数据";
CharSequence contentText = "点击查看文件";
File path = new File(Environment.getExternalStorageDirectory().getPath());
Intent notificationIntent = new Intent(Intent.ACTION_GET_CONTENT);
notificationIntent.setDataAndType(Uri.fromFile(file), "Finance/");
PendingIntent contentIntent = PendingIntent.getActivity(getActivity(), 0,
notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText,
contentIntent);
//用mNotificationManager的notify方法通知用户生成标题栏消息通知
mNotificationManager.notify(1, notification);
vibrator = (Vibrator)getActivity().getSystemService(Context.VIBRATOR_SERVICE);
long [] pattern = {100,400,100,400}; // 停止 开启 停止 开启
vibrator.vibrate(pattern, -1);
} catch (Exception e) {
Toast.makeText(getActivity(), "写入失败" + e, Toast.LENGTH_LONG).show();
} finally {
// Toast.makeText(getActivity(), "关闭", Toast.LENGTH_LONG).show();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
目前完成的主要是这两个界面的功能。
现在介绍下关于记账界面代码:
BillsActivity.java,主要从数据库获得数据,并通过listview显示。常按能够删除账单条目。
package com.bank;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Created by zhouchenglin on 2016/4/1.
*/
public class BillsActivity extends Activity implements View.OnClickListener {
//列举数据的ListView
private ListView mlistbills;
// 适配器
private SimpleAdapter mlistbillsAdapter;
//数据库
private MySQLiteHelper mMysql;
private SQLiteDatabase mDataBase;
private ImageView imageviewback;
// 存储数据的数组列表
ArrayList<HashMap<String, Object>> listData = new ArrayList<HashMap<String, Object>>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bills);
mlistbills = (ListView) this.findViewById(R.id.list_bills);
imageviewback = (ImageView) this.findViewById(R.id.imageviewBack);
imageviewback.setOnClickListener(this);
GetData();
mlistbillsAdapter = new SimpleAdapter(
this,
listData,
R.layout.billsitem,
new String[]{"Time", "Type", "Fee", "Remarks"},
new int[]{R.id.texttimeshow, R.id.imagetypeshow, R.id.textfeeshow, R.id.textremarksshow}
);
//赋予数据
mlistbills.setAdapter(mlistbillsAdapter);
//常按响应
mlistbills.setOnCreateContextMenuListener(listviewLongPress);
//点击事件
// mlistbills.setOnItemClickListener(listviewClick);
// mlistbills.setOnItemClickListener(listviewClick);
//
// mlistbills.setOnItemLongClickListener(listviewLongClick);
mlistbills.setOnTouchListener(onTouchListener);
}
View.OnTouchListener onTouchListener = new View.OnTouchListener() {
float x, y, ux, uy;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
break;
case MotionEvent.ACTION_UP:
ux = event.getX();
uy = event.getY();
int p2 = ((ListView)v).pointToPosition((int) ux, (int) uy);
return false;
}
return false;
}
};
AdapterView.OnItemLongClickListener listviewLongClick = new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
return false;
}
};
AdapterView.OnItemClickListener listviewClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getApplicationContext(),
"weffwe", Toast.LENGTH_SHORT).show();
}
};
//从数据库获得适配器数据
public void GetData() {
mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
Cursor cursor = mDataBase.rawQuery("select * from finance order by ID DESC ", null);
cursor.moveToFirst();
int columnsSize = cursor.getColumnCount();
int number = 0;
while (number < cursor.getCount()) {
// cursor.move(i);
HashMap<String, Object> map = new HashMap<String, Object>();
String budget = cursor.getString(cursor.getColumnIndex("Budget"));
map.put("ID", cursor.getString(cursor.getColumnIndex("ID")));
map.put("Fee", cursor.getDouble(cursor.getColumnIndex("Fee")));
map.put("Time", cursor.getString(cursor.getColumnIndex("Time")));
if (budget.equals("收入"))
map.put("Fee", "+" + cursor.getString(cursor.getColumnIndex("Fee")));
else
map.put("Fee", "-" + cursor.getString(cursor.getColumnIndex("Fee")));
map.put("Remarks", cursor.getString(cursor.getColumnIndex("Remarks")));
if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("衣")) {
map.put("Type", R.drawable.cloth);
} else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("食")) {
map.put("Type", R.drawable.shi);
} else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("住")) {
map.put("Type", R.drawable.zhu);
} else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("行")) {
map.put("Type", R.drawable.xing);
} else if ((cursor.getString(cursor.getColumnIndex("Type"))).equals("其他")) {
map.put("Type", R.drawable.getmoney);
}
cursor.moveToNext();
listData.add(map);
number++;
System.out.println(listData);
}
cursor.close();
mDataBase.close();
mMysql.close();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.imageviewBack:
this.finish();
break;
default:
break;
}
}
// 长按事件响应
View.OnCreateContextMenuListener listviewLongPress = new View.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
new AlertDialog.Builder(BillsActivity.this)
/* 弹出窗口的最上头文字 */
.setTitle("删除当前数据")
/* 设置弹出窗口的图式 */
.setIcon(android.R.drawable.ic_dialog_info)
/* 设置弹出窗口的信息 */
.setMessage("确定删除当前记录")
.setPositiveButton("是",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialoginterface, int i) {
// 获取位置索引
int mListPos = info.position;
// 获取对应HashMap数据内容
HashMap<String, Object> map = listData.get(mListPos);
// 获取id
int id = Integer.valueOf((map.get("ID").toString()));
// 获取数组具体值后,可以对数据进行相关的操作,例如更新数据
String[] whereArgs = new String[]{String.valueOf(id)};
//获取当前数据库
mMysql = new MySQLiteHelper(BillsActivity.this, "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
try {
mDataBase.delete("Finance", "ID=?", whereArgs);
listData.remove(mListPos);
mlistbillsAdapter.notifyDataSetChanged();
} catch (Exception e) {
Log.e("删除出错了", "error");
} finally {
mDataBase.close();
mMysql.close();
}
}
}
).setNegativeButton(
"否",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
}
}
).show();
}
};
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
RecorderActivity.java
主要功能是添加账目,记录自己的消费。
package com.bank;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Calendar;
public class RecorderActivity extends Activity implements View.OnClickListener {
private Button mbutton_sure, mbutton_cancel;
private Spinner mspinner_type;
private EditText medittext_fee, medittext_remarks;
private TextView medittext_time;
private RadioGroup mRadiogroup;
private MySQLiteHelper mMysql;
private SQLiteDatabase mDataBase;
private ImageButton imageButtonBack;
// 用来装日期的
private Calendar calendar;
//日历控件
private DatePickerDialog dialog;
//保存类型数据
private String content_type, content_select_group;
private ArrayList<String> Data = new ArrayList<String>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recorder);
//获得控件
mbutton_sure = (Button) findViewById(R.id.plan_sure);
mbutton_cancel = (Button) findViewById(R.id.button_cancel);
medittext_time = (TextView) findViewById(R.id.edit_text_time);
medittext_fee = (EditText) findViewById(R.id.editText_fee);
medittext_remarks = (EditText) findViewById(R.id.editText_remarks);
mbutton_sure = (Button) findViewById(R.id.plan_sure);
mspinner_type = (Spinner) findViewById(R.id.spinner_type);
mRadiogroup = (RadioGroup) this.findViewById(R.id.radioGroup);
imageButtonBack = (ImageButton) this.findViewById(R.id.imageButtonBack);
//设置Spinner的数据并操作
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.Select_item, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//将数据和spinner控件绑定在一起
mspinner_type.setAdapter(adapter);
medittext_time.setOnClickListener(this);
imageButtonBack.setOnClickListener(this);
mspinner_type.setOnItemSelectedListener(listener);
mRadiogroup.setOnCheckedChangeListener(grouplistener);
mbutton_sure.setOnClickListener(this);
mbutton_cancel.setOnClickListener(this);
}
//单选按钮点击响应
RadioGroup.OnCheckedChangeListener grouplistener = new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
// TODO Auto-generated method stub
//获取变更后的选中项的ID
int radioButtonId = arg0.getCheckedRadioButtonId();
//根据ID获取RadioButton的实例
content_select_group = (((RadioButton) findViewById(radioButtonId)).getText()).toString();
}
};
//spinner控件的响应事件
AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// An item was selected. You can retrieve the selected item using
content_type = mspinner_type.getItemAtPosition(pos).toString();
// Toast.makeText(getActivity(), "选中了"+content_type, Toast.LENGTH_LONG).show();
}
public void onNothingSelected(AdapterView<?> parent) {
// Another interface callback
}
};
//视图组件点击时间
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.plan_sure:
Data.clear();
Data.add(content_type);
Data.add(medittext_time.getText().toString());
Data.add(medittext_fee.getText().toString());
Data.add(medittext_remarks.getText().toString());
Data.add(content_select_group);
// Toast.makeText(getActivity(), "click sure button" + Data, Toast.LENGTH_LONG).show();
WriteData(Data);
// Toast.makeText(getActivity(), "click sure button" + Data, Toast.LENGTH_LONG).show();
break;
case R.id.button_cancel:
// GetData()
this.finish();
break;
case R.id.imageButtonBack:
this.finish();
break;
case R.id.edit_text_time:
calendar = Calendar.getInstance();
dialog = new DatePickerDialog(
this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calendar.set(year, monthOfYear, dayOfMonth);
medittext_time.setText(DateFormat.format("yyy-MM-dd", calendar));
}
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH)
);
dialog.show();
break;
default:
break;
}
}
public void WriteData(ArrayList<String> Data)
{
mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
ContentValues cv=new ContentValues();
cv.put("Type",Data.get(0));
cv.put("Time",Data.get(1));
cv.put("Fee",Data.get(2));
cv.put("Remarks",Data.get(3));
cv.put("Budget",Data.get(4));
mDataBase.insert("finance", "Type", cv);
mDataBase.close();
mMysql.close();
//结束当前activity
this.finish();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
MySQLiteHelper.java 数据库操作的辅助类。
package com.bank;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.util.Log;
import java.io.File;
/**
* Created by zhouchenglin on 2016/3/28.
*/
public class MySQLiteHelper extends SQLiteOpenHelper {
//抽象类必须调用父类方法
public MySQLiteHelper(Context context, String name, CursorFactory factory, int version) {
//调用父类构造函数
super(context, getMyDatabaseName(name), factory, version);
}
private static String getMyDatabaseName(String name){
String databasename = name;
boolean isSdcardEnable = false;
String state = Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){//SDCard是否插入
isSdcardEnable = true;
}
String dbPath = null;
if(isSdcardEnable){
dbPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Finance/database/";
}else{//未插入SDCard,建在内存中
}
File dbp = new File(dbPath);
if(!dbp.exists()){
dbp.mkdirs();
}
databasename = dbPath + databasename;
return databasename;
}
/**
* 当数据库首次创建时执行该方法,一般将创建表等初始化操作放在该方法中执行.
* 重写onCreate方法,调用execSQL方法创建表
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("SWORD", "create a Database");
//创建数据库sql语句
String sql = "create table finance(ID integer PRIMARY KEY AUTOINCREMENT,Type varchar(10),Time varchar(20),Fee double,Remarks varchar(20),Budget varchar(10))";
//执行创建数据库操作
db.execSQL(sql);
//创建表
sql = "create table plan(ID integer PRIMARY KEY AUTOINCREMENT,Morningplan varchar(100),Afternoonplan varchar(100),Nightplan varchar(100),Rank varchar(5), Conclusion varchar(100))";
//执行创建数据库操作
db.execSQL(sql);
}
@Override
//当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
SubmitDataService.java
主要是同步数据的时候需要用到的服务。
package com.bank;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Binder;
import android.os.IBinder;
import android.os.Vibrator;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
/**
* Created by zhouchenglin on 2016/4/13.
*/
public class SubmitDataService extends Service {
private Vibrator vibrator;
boolean finishflag =false;
//数据库
private MySQLiteHelper mMysql;
private SQLiteDatabase mDataBase;
IBinder myBinder = new MyBinder();
class MyBinder extends Binder {
public Service getService(){
return SubmitDataService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return myBinder;
}
public boolean getfinishflag()
{
return finishflag;
}
//第一次开始的时候执行,或者关闭服务后执行
@Override
public void onCreate() {
super.onCreate();
// Log.d(TAG, "onCreate() executed");
}
// 每次开启服务都会执行,重新开启服务都会执行
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
SubmitData();
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
//销毁服务
public void onDestroy() {
super.onDestroy();
}
public void SubmitData() {
mMysql = new MySQLiteHelper(this, "finance.db", null, 1);
mDataBase = mMysql.getReadableDatabase();
Cursor cursor = mDataBase.rawQuery("select * from finance", null);
cursor.moveToFirst();
int columnsSize = cursor.getColumnCount();
int number = 0;
while (number < cursor.getCount()) {
String budget = cursor.getString(cursor.getColumnIndex("Budget"));
int ID = cursor.getInt(cursor.getColumnIndex("ID"));
Double Fee =cursor.getDouble(cursor.getColumnIndex("Fee"));
String Time =cursor.getString(cursor.getColumnIndex("Time"));
String Remarks = cursor.getString(cursor.getColumnIndex("Remarks"));
String Type =cursor.getString(cursor.getColumnIndex("Type"));
String xml = CreateXml(ID,Type,Fee,Time,Remarks,budget);
SubmitRequest(xml);
cursor.moveToNext();
number++;
}
cursor.close();
mDataBase.close();
mMysql.close();
//消息通知栏
//定义NotificationManager
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager)getSystemService(ns);
//定义通知栏展现的内容信息
int icon = R.drawable.back;
CharSequence tickerText = "通知栏";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
//定义下拉通知栏时要展现的内容信息
Context context = getApplicationContext();
CharSequence contentTitle = "已经完成同步";
CharSequence contentText = "进入程序查看详情";
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText,
contentIntent);
//用mNotificationManager的notify方法通知用户生成标题栏消息通知
mNotificationManager.notify(1, notification);
vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
long [] pattern = {100,400,100,400}; // 停止 开启 停止 开启
vibrator.vibrate(pattern,-1);
}
public String CreateXml(int ID, String Type, double Fee, String Time, String Remarks, String Budget)
{
String xml = "<?xml version='1.0' encoding='UTF-8'?>"
+ "<Data>"
+ "<ID>" + ID + "</ID>"
+ "<Type>" + Type + "</Type>"
+ "<Fee>" + Fee + "</Fee>"
+ "<Time>" + Time + "</Time>"
+ "<Remarks>" + Remarks + "</Remarks>"
+ "<Budget>" + Budget + "</Budget>"
+ "</Data>";
return xml;
}
//执行功能的函数
public void SubmitRequest(String xml) {
try {
// 创建url资源
URL url = new URL("http://119.29.85.118//finance.php");
// 建立http连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置允许输出
conn.setDoOutput(true);
conn.setDoInput(true);
// 设置不用缓存
conn.setUseCaches(false);
// 设置传递方式
conn.setRequestMethod("POST");
// 设置维持长连接
conn.setRequestProperty("Connection", "Keep-Alive");
// 设置文件字符集:
conn.setRequestProperty("Charset", "UTF-8");
//转换为字节数组
byte[] data = xml.getBytes();
// 设置文件长度
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
// 设置文件类型:
conn.setRequestProperty("contentType", "text/xml");
// 开始连接请求
conn.connect();
OutputStream out = conn.getOutputStream();
// 写入请求的字符串
out.write(data);
out.flush();
out.close();
System.out.println(conn.getResponseCode());
// 请求返回的状态
if (conn.getResponseCode() == 200) {
System.out.println("连接成功");
// 请求返回的数据
InputStream in = conn.getInputStream();
String a = null;
try {
byte[] data1 = new byte[in.available()];
in.read(data1);
// 转成字符串
a = new String(data1);
System.out.println(a);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else {
System.out.println("no++");
}
finishflag =true;
} catch (Exception e) {
finishflag =false;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
还有服务端代码也给出来,通过操作xml文件来传递数据。
finance.php
<?php
$file_in = file_get_contents("php://input");
$xml=simplexml_load_string($file_in);
ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT);
$Type ="食";
$Time ="2015-02-01";
$ID =3;
$connection =mysql_connect("localhost","zhouchenglin","zhouchenglin");
if(!$connection)
{
die("不能连接数据库:".mysql_error());
} else{
echo "连接成功";
}
if(!mysql_select_db("zhouchenglin",$connection)) {
die("Select Database Failed: " . mysql_error($connection));
}else{
echo "数据库连接成功";
}
mysql_query("set names utf8");
$sql =sprintf("INSERT INTO `finance`(`ID`,`Type`, `Time`,`Fee`,`Remarks`,`Budget`)VALUES('%d', '%s','%s','%f','%s','%s')",$xml->ID,$xml->Type,$xml->Time,$xml->Fee,$xml->Remarks,$xml->Budget);
$res =mysql_query($sql,$connection);
if(!$res){
die(mysql_error());
echo '执行失败';
}
else
echo '执行成功';
mysql_close($connection);
?>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
主要的功能都是通过这些代码实现。我就粘贴几个重要的布局文件。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eee"
android:orientation="vertical"
android:weightSum="1">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:background="#628fd0">
</LinearLayout>
<android.support.v4.view.ViewPager
android:id="@+id/id_viewpager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.97"
>
</android.support.v4.view.ViewPager>
<include layout="@layout/bottom_bar"
/>
</LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
bottom_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ly_main_tab_bottom"
android:layout_width="fill_parent"
android:layout_height="70dp"
android:layout_alignParentBottom="true"
android:background="@drawable/tar_bar1" >
<!--android:background="@drawable/bottom_bar" >-->
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:id="@+id/id_tab_bottom_weixin"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:descendantFocusability="beforeDescendants"
android:gravity="center"
android:orientation="vertical" >
<ImageButton
android:id="@+id/btn_tab_bottom_weixin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000"
android:clickable="false"
android:src="@drawable/tab_weixin_pressed" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账户" />
</LinearLayout>
<LinearLayout
android:id="@+id/id_tab_bottom_friend"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:descendantFocusability="beforeDescendants"
android:gravity="center"
android:orientation="vertical" >
<ImageButton
android:id="@+id/btn_tab_bottom_friend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000"
android:clickable="false"
android:src="@drawable/tab_find_frd_normal" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计划详情" />
</LinearLayout>
<LinearLayout
android:id="@+id/id_tab_bottom_contact"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:descendantFocusability="beforeDescendants"
android:gravity="center"
android:orientation="vertical" >
<ImageButton
android:id="@+id/btn_tab_bottom_contact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000"
android:clickable="false"
android:src="@drawable/tab_address_normal" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="多记计" />
</LinearLayout>
<LinearLayout
android:id="@+id/id_tab_bottom_setting"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:descendantFocusability="beforeDescendants"
android:gravity="center"
android:orientation="vertical" >
<ImageButton
android:id="@+id/btn_tab_bottom_setting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000"
android:clickable="false"
android:src="@drawable/tab_settings_normal" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
bills.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#FFFFFF">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:id="@+id/linearLayout3"
android:orientation="horizontal"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="false"
android:background="#444eb9"
android:weightSum="1"
android:gravity="center_vertical">
<ImageView
android:layout_width="80dp"
android:layout_height="30dp"
android:id="@+id/imageviewBack"
android:src="@drawable/back"
android:background="#444eb9"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账单"
android:id="@+id/textView2"
android:layout_gravity="center_vertical"
android:background="#444eb9"
android:layout_marginLeft="80dp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:editable="false"
android:enabled="false"
android:hint="size"
android:textIsSelectable="false"
android:textSize="20dp"/>
</LinearLayout>
<ListView
android:id="@+id/list_bills"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:divider="#ffffff"
android:dividerHeight="1dip"
android:layout_below="@+id/linearLayout3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="#fbf5f5"/>
</RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
billsitem.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="no data"
android:id="@+id/texttimeshow"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginRight="28dp"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:gravity="center"/>
<ImageView
android:layout_width="55dp"
android:layout_height="55dp"
android:id="@+id/imagetypeshow"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/texttimeshow"
android:padding="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="no data"
android:id="@+id/textfeeshow"
android:layout_marginLeft="61dp"
android:layout_marginStart="61dp"
android:layout_alignParentTop="true"
android:layout_alignLeft="@+id/textremarksshow"
android:layout_alignStart="@+id/textremarksshow"
android:layout_marginTop="10dp"
android:gravity="center"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Large Text"
android:id="@+id/textremarksshow"
android:layout_alignBottom="@+id/imagetypeshow"
android:layout_toRightOf="@+id/imagetypeshow"
android:layout_toEndOf="@+id/imagetypeshow"
android:layout_marginLeft="34dp"
android:layout_marginStart="34dp"
android:gravity="center"/>
</RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
finance_check.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="余额"
android:layout_marginLeft="90dp"
android:layout_alignBottom="@+id/textremainder"
android:layout_alignParentTop="true"
android:layout_marginTop="200dp"
android:id="@+id/textView4"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="19.8"
android:id="@+id/textremainder"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="false"
android:layout_alignParentStart="false"
android:layout_alignWithParentIfMissing="false"
android:layout_alignParentLeft="false"
android:layout_marginTop="200dp"
android:layout_marginRight="100dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="当前本月支出"
android:id="@+id/textView3"
android:layout_below="@+id/textView4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="41dp"
android:layout_marginLeft="90dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="500"
android:id="@+id/textpay"
android:layout_alignTop="@+id/textView3"
android:layout_alignLeft="@+id/textremainder"
android:layout_alignStart="@+id/textremainder"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="本月收入"
android:id="@+id/textView6"
android:layout_below="@+id/textView3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="40dp"
android:layout_marginLeft="90dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="7000"
android:id="@+id/textincome"
android:layout_alignTop="@+id/textView6"
android:layout_alignLeft="@+id/textpay"
android:layout_alignStart="@+id/textpay"/>
</RelativeLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
recorder.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#e2efd9"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
android:id="@+id/linearLayout3"
android:orientation="horizontal"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="false"
android:background="#444eb9"
android:weightSum="1"
android:gravity="center_vertical">
<ImageButton
android:layout_width="80dp"
android:layout_height="30dp"
android:id="@+id/imageButtonBack"
android:src="@drawable/back"
android:background="#444eb9"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记一笔"
android:id="@+id/textView2"
android:layout_gravity="center_vertical"
android:background="#444eb9"
android:layout_marginLeft="80dp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:editable="false"
android:enabled="false"
android:hint="size"
android:textIsSelectable="false"
android:textSize="20dp"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="类型"
android:id="@+id/texttype"
android:layout_gravity="center_horizontal"
android:textStyle="bold"
android:clickable="false"
android:editable="false"
android:textColor="#0472f8"
android:layout_weight="0.00"
android:layout_marginLeft="57dp"
android:layout_marginStart="57dp"
android:layout_marginTop="24dp"
android:layout_below="@+id/radioGroup"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间"
android:id="@+id/texttimeshow"
android:layout_gravity="center_horizontal"
android:textColor="#0472f8"
android:layout_below="@+id/texttype"
android:layout_toLeftOf="@+id/spinner_type"
android:layout_toStartOf="@+id/spinner_type"
android:layout_marginTop="44dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="费用"
android:id="@+id/textfeeshow"
android:layout_gravity="center_horizontal"
android:textColor="#0472f8"
android:layout_marginTop="29dp"
android:layout_below="@+id/edit_text_time"
android:layout_toLeftOf="@+id/spinner_type"
android:layout_toStartOf="@+id/spinner_type"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="备注"
android:id="@+id/textremarksshow"
android:layout_gravity="center_horizontal"
android:textColor="#0472f8"
android:layout_marginTop="27dp"
android:layout_below="@+id/editText_fee"
android:layout_toLeftOf="@+id/spinner_type"
android:layout_toStartOf="@+id/spinner_type"/>
<Spinner
android:layout_width="match_parent"
android:layout_height="25dp"
android:id="@+id/spinner_type"
android:spinnerMode="dialog"
android:entries="@array/Select_item"
android:layout_alignBottom="@+id/texttype"
android:layout_toRightOf="@+id/texttype"
android:layout_marginLeft="43dp"
android:layout_marginRight="50dp"
android:gravity="center_vertical|center"
android:paddingLeft="50dp"
android:touchscreenBlocksFocus="false"
android:layout_alignParentLeft="false"
style="@android:style/TextAppearance.Holo"/>
<TextView
android:id="@+id/edit_text_time"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:background="@android:drawable/edit_text"
android:layout_alignTop="@+id/texttimeshow"
android:layout_alignLeft="@+id/spinner_type"
android:layout_alignStart="@+id/spinner_type"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="50dp"
android:editable="true"
android:gravity="center"
android:textColor="#736bae"/>
<EditText
android:id="@+id/editText_fee"
android:editable="true"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@android:drawable/edit_text"
android:layout_alignTop="@+id/textfeeshow"
android:layout_alignLeft="@+id/edit_text_time"
android:layout_alignStart="@+id/edit_text_time"
android:layout_marginRight="50dp"
android:textColor="#fc0303"
android:gravity="center"/>
<EditText
android:id="@+id/editText_remarks"
android:layout_width="fill_parent"
android:layout_height="94dp"
android:inputType="textMultiLine"
android:singleLine="false"
android:gravity="left|top"
android:width="2dip"
android:background="@android:drawable/edit_text"
android:layout_alignTop="@+id/textremarksshow"
android:layout_alignLeft="@+id/editText_fee"
android:layout_alignStart="@+id/editText_fee"
android:layout_marginRight="50dp"
android:textColor="#5e5b5b"
android:textSize="15dp"/>
<Button
android:layout_width="50dp"
android:layout_height="30dp"
android:text="保存"
android:id="@+id/plan_sure"
android:background="@drawable/buttonshape"
android:layout_below="@+id/editText_remarks"
android:layout_alignLeft="@+id/texttype"
android:layout_alignStart="@+id/texttype"
android:layout_marginTop="36dp"
android:layout_marginLeft="20dp"/>
<Button
android:layout_width="50dp"
android:layout_height="30dp"
android:text="取消"
android:id="@+id/button_cancel"
android:background="@drawable/buttonshape"
android:layout_alignTop="@+id/plan_sure"
android:layout_alignRight="@+id/editText_remarks"
android:layout_alignEnd="@+id/editText_remarks"
android:layout_marginRight="20dp"/>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:gravity="center_vertical"
android:id="@+id/radioGroup"
android:layout_below="@+id/linearLayout3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="58dp">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="收入"
android:id="@+id/radioButton"
android:checked="false"
android:layout_below="@+id/linearLayout3"
android:layout_alignLeft="@+id/texttimeshow"
android:layout_alignStart="@+id/texttimeshow"
android:layout_gravity="center_vertical"
android:layout_marginLeft="50dp"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="支出"
android:id="@+id/radioButton2"
android:checked="false"
android:layout_alignBottom="@+id/radioGroup"
android:layout_centerHorizontal="true"
android:layout_marginLeft="50dp"/>
</RadioGroup>
</RelativeLayout>