目录
1 系统需求分析……………………………………………………………………………………………2
1.1 系统介绍……………………………………………………………………………………………..2
1.2 系统的功能性需求………………………………………………………………………………..2
1.3 软硬件环境需求…………………………………………………………………………………… 2
2. 系统设计………………………………………………………………………………………………….. 2
2.1 系统概述…………………………………………………………………………………………….. 2
2.2 系统总体结构………………………………………………………………………………………..2
2.3 开发环境的配置……………………………………………………………………………………3
3. 详细设计及实现…………………………………………………………………………………………3
3.1 数据库系统设计……………………………………………………………………………………3
3.2 界面原型设计………………………………………………………………………………………. 4
4系统代码编写………………………………………………………………………………………………5
4.1 代码编写思路………………………………………………………………………………………. 5
4.2 系统主界面的实现……………………………………………………………………………….. 6
4.3 系统功能模块配置的实现…………………………………………………………………….. 10
4.4 模块功能流程设计………………………………………………………………………………. 11
4.5 代码编写实现………………………………………………………………………………………12
5总结…………………………………………………………………………………………………………..17
1 系统需求分析
1.1 系统介绍
本作品是一个简单的记事本程序,能实现事件类别的管理(包括增加、删除、修改),记录的关键信息的包括:事件标题、事件内容、位置信息、照片等。
1.2 系统的功能性需求
1.事件类别的管理(包括增加、删除、修改);
2.提醒类别管理(包括增加修改、删除、增加);
3.事件的管理(包括增加、删除、修改),关键信息包括:事件标题、关键字、事件内容、位置信息(城市、区域的信息)、照片;
1.3 软硬件环境需求
最低硬件配置:单核,256MB的RAM
软件平台:Android2.0以上
2.系统设计
2.1 系统概述
本记事本软件主要用于记录生活点滴的基于Android平台的软件,可以运行于基于Android平台的手持设备。
2.2 系统总体结构
本作品实现的功能模块主要包括:添加、删除、修改事件,增加、删除、修改分类,定位,拍照,总体结构如图1所示:
图1.系统总体结构图
2.3 开发环境的配置
1.eclipse-java-mars-1-win32-x86_64
2. JDK 1.8.0_45
3.详细设计及实现
3.1 数据库系统设计
1.数据库表的定义(TableNames[]):
tbl_type
tbl_note
类型
表名
2.字段定义(FieldNames[][]):
表 字段
_id
note_title
note_type
note_content
_id
tbl_type
tbl_num
3.2 界面原型设计
图1.登录界面 图4.修改界面
图2.主界面 图3.新增(可以实现定位、插入图片、新增记事)
图6.查看界面
4.系统代码编写
4.1 代码编写思路
如图7:
图7.整体代码分布框架
4.2 系统主界面的实现
1.主界面的部分布局文件:
package com.example.Notepad;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
importandroid.content.Intent;
importandroid.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
importandroid.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
importandroid.view.MenuItem;
import android.view.View;
importandroid.view.View.OnCreateContextMenuListener;
importandroid.view.ViewGroup;
importandroid.widget.AdapterView;
importandroid.widget.AdapterView.AdapterContextMenuInfo;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.BaseAdapter;
importandroid.widget.LinearLayout;
importandroid.widget.ListView;
importandroid.widget.TextView;
import android.widget.Toast;
importcontroller.NoteBookUtils;
import database.Note;
public class MainInterfaceActivityextends Activity {
private Cursor cursor=null;
private static final String TAG =null;
private ListView lv;
private TextView init;
private NoteBookUtils note;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_interface);
note = new NoteBookUtils(this);
initViews();//获取框架:
//refreshView();
update();
lv.setOnItemClickListener(newmyOnItemClickListener());
lv.setOnCreateContextMenuListener(newmyOnCreateContextMenuListener());
//设置长按监听器三个选项
}
public voidonItemClick(AdapterView<?> parent, View view, int position,long id) {
Intent intent = newIntent(MainInterfaceActivity.this,CheckActivity.class);
intent.putExtra("lv_item_id", id);
startActivity(intent);
}
private void update() {
if (refreshView()) {
lv.setVisibility(View.VISIBLE);
init.setVisibility(View.INVISIBLE);
} else {
lv.setVisibility(View.INVISIBLE);
init.setVisibility(View.VISIBLE);
}
}
List<Note> notes;
private boolean refreshView() {
notes = note.getAll();
if(notes.size()==0){
return false;
}
lv.setAdapter(new MyAdapter());
return true;
}
//初始化架构
private void initViews() {
// TODO Auto-generatedmethod stub
//ll=(LinearLayout)findViewById(R.id.ll);
lv=(ListView)findViewById(R.id.lv);
init=(TextView)findViewById(R.id.init);
}
//添加
public void addNote(View view){
Intent intent=new Intent();
intent.setClass(MainInterfaceActivity.this, EditActivity.class);
startActivity(intent);
}
public classmyOnCreateContextMenuListener implementsOnCreateContextMenuListener{
public voidonCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
menu.setHeaderTitle("");
//设置选项
Log.i("log", "chooseingmenu");
menu.setHeaderTitle("记事本操作");
menu.add(0,1,0,"修改");
menu.add(0,2,0,"删除");
}
}
@SuppressWarnings("null")
public booleanonContextItemSelected(MenuItem item) {
// 得到当前被选中的item信息
//note.open();
AdapterContextMenuInfomenuInfo = (AdapterContextMenuInfo)item.getMenuInfo();
final Note nt=notes.get(menuInfo.position);
Log.v(TAG, "context itemseleted ID="+ menuInfo.id);
switch(item.getItemId())
{
case 1:
Intent intent=new Intent();
intent.putExtra("title", nt.title);
intent.putExtra("description", nt.description);
intent.setClass(MainInterfaceActivity.this,UpdateActivity.class);
MainInterfaceActivity.this.startActivity(intent);
break;
case 2:
String id=nt.getId();
System.out.println("id----->"+id);
note.deleteNoteWithId(id);
Toast.makeText(MainInterfaceActivity.this,
"删除" + nt.getTitle() +"成功",1);
refreshView();
break;
default:
Activityreturnsuper = null;
returnsuper.onContextItemSelected(item);
}
return true;
}
public class MyAdapter extends BaseAdapter{
//构造方法
@Override
public View getView(int position,final View convertView, final ViewGroup parent) {
final Note note=notes.get(position);//位置
long datetime=Long.valueOf(note.createtime);
SimpleDateFormatformatter = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
LinearLayout ll=newLinearLayout(MainInterfaceActivity.this);
ll.setOrientation(LinearLayout.VERTICAL);
TextView tv =newTextView(MainInterfaceActivity.this);
tv.setText(note.title+" "+formatter.format(datetime));
ll.addView(tv);
return ll;
}
@Override
public int getCount() {
// TODO Auto-generatedmethod stub
return notes.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generatedmethod stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generatedmethod stub
return 0;
}
}
public class myOnItemClickListenerimplements OnItemClickListener{
public voidonItemClick(AdapterView<?> arg0, View v, int position,long id) {
final Note note=notes.get(position);//位置
long datetime=Long.valueOf(note.createtime);
SimpleDateFormatformatter = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
Intent intent = new Intent();
// intent.putExtra("id",cursor.getString(cursor.getColumnIndex("_id")));
intent.putExtra("title", note.title);
intent.putExtra("description", note.description);
intent.putExtra("time",formatter.format(datetime));
intent.setClass(MainInterfaceActivity.this, CheckActivity.class);
MainInterfaceActivity.this.startActivity(intent);
}
}
}
2.新增记事界面部分文件:
packagecom.example.Notepad;
importjava.util.Calendar;
importcom.baidu.location.BDLocation;
importcom.baidu.location.BDLocationListener;
importcom.baidu.location.LocationClient;
importcom.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
importandroid.app.Activity;
importandroid.app.AlarmManager;
importandroid.app.Dialog;
importandroid.app.PendingIntent;
importandroid.app.TimePickerDialog;
importandroid.content.Context;
import android.content.Intent;
importandroid.database.Cursor;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.media.ExifInterface;
import android.net.Uri;
importandroid.os.Bundle;
importandroid.provider.MediaStore;
importandroid.provider.MediaStore.MediaColumns;
importandroid.text.Editable;
importandroid.text.Spannable;
importandroid.text.SpannableString;
importandroid.text.TextUtils;
importandroid.text.style.ImageSpan;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.EditText;
importandroid.widget.TextView;
importandroid.widget.TimePicker;
importandroid.widget.Toast;
importcontroller.NoteBookUtils;
import database.Note;
public classEditActivity extends Activity{
private LocationClient mLocationClient;
public static final String TAG ="Alarm";
private AlarmManager alarmManager=null;
private NoteBookUtils utils;
final int DIALOG_TIME = 0; //设置对话框id
private EditText ed_title;
private EditText ed_local;
private EditText ed_content;
private String path = null;
private Bitmap bitmap = null;
int rotate = 0;
Calendar cal=Calendar.getInstance();
protected void onCreate(BundlesavedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
initViews();//获取框架
}
private void initViews() {
// TODO Auto-generated method stub
ed_local=(EditText)findViewById(R.id.local);
ed_title=(EditText)findViewById(R.id.edit_title);
ed_content=(EditText)findViewById(R.id.editactivity_eidtText);
alarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
}
public void Save(View view){
Stringtitle=ed_title.getText().toString();
if (TextUtils.isEmpty(title)) {
mT("输入的标题不能为空");
return;
}
String content=ed_content.getText().toString();
if (TextUtils.isEmpty(content)){
mT("输入的标题不能为空");
return;
}
System.out.println("标题:"+title);
System.out.println("内容:"+content);
//保存到数据库中;
savaToDb(title,content);
Intent intent=new Intent();
intent.setClass(EditActivity.this,MainInterfaceActivity.class);
startActivity(intent);
}
private void savaToDb(String title, Stringcontent) {
// TODO Auto-generated method stub
String createtime =System.currentTimeMillis()+"";
Note note=new Note(title, content,createtime);
NoteBookUtils utils =newNoteBookUtils(this);
if(utils.addNote(note)!=-1){
mT("数据添加成功");
finish();
}
}
public void TakePhoto(View view){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
}
public void Location(View view){
mLocationClient = new LocationClient(this.getApplicationContext());
mLocationClient.registerLocationListener(newMyLocationListener());
InitLocation();
mLocationClient.start();
}
public void Clock(View view){
showDialog(DIALOG_TIME);//显示时间选择对话框
}
public void SetPciture(View view){
Intent intent=newIntent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
intent.putExtra("return-data",true);
startActivityForResult(intent, 1);
}
//打印方法:
private void mT(String message){
Toast.makeText(this, message, 0).show();
}
private void InitLocation(){
LocationClientOption option = newLocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
//option.setCoorType(tempcoor);//返回的定位结果是百度经纬度,默认值gcj02
int span=1000;
option.setScanSpan(span);//设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);
mLocationClient.setLocOption(option);
}
protected Dialog onCreateDialog(int id) {
Dialog dialog=null;
switch (id) {
case DIALOG_TIME:
dialog=new TimePickerDialog(
this,
new TimePickerDialog.OnTimeSetListener(){
public void onTimeSet(TimePicker timePicker, int hourOfDay,int minute) {
Calendar c=Calendar.getInstance();//获取日期对象
c.setTimeInMillis(System.currentTimeMillis()); //设置Calendar对象
c.set(Calendar.HOUR, hourOfDay); //设置闹钟小时数
c.set(Calendar.MINUTE, minute); //设置闹钟的分钟数
c.set(Calendar.SECOND, 0); //设置闹钟的秒数
c.set(Calendar.MILLISECOND, 0); //设置闹钟的毫秒数
Intent intent = new Intent(EditActivity.this, AlarmReceiver.class); //创建Intent对象
PendingIntent pi = PendingIntent.getBroadcast(EditActivity.this, 0,intent, 0); //创建PendingIntent
//alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),pi); //设置闹钟
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),pi); //设置闹钟,当前时间就唤醒
Toast.makeText(EditActivity.this, "闹钟设置成功",Toast.LENGTH_LONG).show();//提示用户
}
},
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE),
false);
break;
}
return dialog;
}
public class MyLocationListener implementsBDLocationListener {
@Override
public void onReceiveLocation(BDLocationlocation) {
StringBuffer lc = newStringBuffer(256);
if (location.getLocType() ==BDLocation.TypeGpsLocation){
lc.append(location.getAddrStr());
} else if (location.getLocType() ==BDLocation.TypeNetWorkLocation){
lc.append(location.getAddrStr());
}
System.out.println(lc.toString());
ed_local.setText(lc.toString());
}
}
protected void onActivityResult(intrequestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,resultCode, data);
if(resultCode==RESULT_OK){
path=getpath(data.getData());
BitmapFactory.Options options =newBitmapFactory.Options();
options.inJustDecodeBounds=true;
//获取照片的宽和高
bitmap=BitmapFactory.decodeFile(path,options);
//此时返回bm为空
options.inJustDecodeBounds=false;
//计算缩放比
int be = (int)(options.outHeight/(float)100);
if (be <= 0)
be = 1;
options.inSampleSize=be;
Log.i("log","be---->"+be);
//重新读入图片
bitmap=BitmapFactory.decodeFile(path,options);
int bitmapwidth=options.outWidth;
int bitmapheight=options.outHeight;
//检查图片是否要翻转
try {
ExifInterface exifInterface =newExifInterface(path);
intresult=exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
switch (result) {
caseExifInterface.ORIENTATION_ROTATE_90:
rotate=90;
Log.i("log","rotate----->"+rotate);
break;
caseExifInterface.ORIENTATION_ROTATE_180:
rotate=180;
Log.i("log","rotate----->"+rotate);
break;
caseExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
Log.i("log","rotate----->"+rotate);
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
if(rotate!=0&&bitmap!=null){
android.graphics.Matrixmatrix=new android.graphics.Matrix();
matrix.reset();
matrix.setRotate(rotate);
Bitmap bitmap1=Bitmap.createBitmap(bitmap, 0, 0, options.outWidth, options.outHeight, matrix,true);
bitmap = bitmap1;
rotate=0;
bitmapwidth=options.outHeight;
bitmapheight=options.outWidth;
}
@SuppressWarnings("deprecation")
Drawabledrawable = new BitmapDrawable(bitmap);
drawable.setBounds(0, 0,bitmapwidth*2,bitmapheight*2);
String iconname = path.substring(path.lastIndexOf("/")+1);
String iconimfo="["+iconname+"]";
SpannableString spannable = new SpannableString(iconimfo);
ImageSpan span = new ImageSpan(drawable,ImageSpan.ALIGN_BOTTOM);
spannable.setSpan(span,0,iconimfo.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
int select=ed_content.getSelectionStart();
Editable edit =ed_content.getEditableText();
edit.insert(select, spannable);
try {
utils.insertPath(iconname,path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("deprecation")
String getpath(Uri uri) {
String[] projection ={MediaColumns.DATA};
Cursor cursor = managedQuery(uri,projection, null, null, null);
startManagingCursor(cursor);
int column_index =cursor.getColumnIndexOrThrow(MediaColumns.DATA);
// 记录图片的位置
Log.i("log","column_index---->"+column_index);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
4.3 系统功能模块配置的实现
逻辑结构图:
图8.逻辑结构图
各个模块如何实现的 插入 删除 修改 照相 定位 等附上代码?(还是截图都可以吧)
4.4 模块功能流程设计
1.新增事件:
图8.新增事件
2.修改事件:
图9.修改事件
3.删除事件:
图10.删除事件
4.5 代码编写实现
登录代码:
packagecom.example.Notepad;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.content.SharedPreferences;
importandroid.view.Menu;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.CheckBox;
importandroid.widget.EditText;
importandroid.widget.ImageButton;
importandroid.widget.Toast;
public classMainActivity extends Activity {
private EditText userName, password;
private Button btn_login;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
}
public void Login(View view){
String userNameValue =userName.getText().toString();
String passwordValue =password.getText().toString();
if(userNameValue.equals("chen")&&passwordValue.equals("123"))
{
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
Intentintent=new Intent();
intent.setClass(MainActivity.this,LogoActivity.class);
startActivity(intent);
}
else{
Toast.makeText(MainActivity.this,"用户名或密码错误,请重新登录",Toast.LENGTH_LONG).show();
}
}
private void initview() {
userName=(EditText)findViewById(R.id.login_user_edit);
password=(EditText)findViewById(R.id.login_passwd_edit);
btn_login=(Button)findViewById(R.id.login_login_btn);
}
public void login_mainweixin(View view){
}
}
5总结
通过这个课程设计,我们体会到了团队合作的重要性,也收获了一点小小的项目经验。在设计整个软件时,先明确要实现功能是非常重要的,要做什么?要用什么做?其次就是界面设计,界面是与用户交互的接口,如何设计好界面?如何设计界面才能让人看上去更协调?如何设计才能够更友好地操作?这些都是我们要考虑的,等到这些都准备好后,才是开始写代码,这样才不会慌乱,才能写出条理清楚的代码。
本记事本虽然是一个初级的入门小程序,但是涉及到的东西也很多,比如定位,这些平时在课本中都没有接触,就需要我们自己去查找资料,这让我们体会到自学能力的重要性。未来,我们相信我们在拥有一些基本的素质之后,一定能够在代码的路上越走越远。