安卓记事本实验报告

xiaoxiao2021-02-28  107

目录

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总结 通过这个课程设计,我们体会到了团队合作的重要性,也收获了一点小小的项目经验。在设计整个软件时,先明确要实现功能是非常重要的,要做什么?要用什么做?其次就是界面设计,界面是与用户交互的接口,如何设计好界面?如何设计界面才能让人看上去更协调?如何设计才能够更友好地操作?这些都是我们要考虑的,等到这些都准备好后,才是开始写代码,这样才不会慌乱,才能写出条理清楚的代码。 本记事本虽然是一个初级的入门小程序,但是涉及到的东西也很多,比如定位,这些平时在课本中都没有接触,就需要我们自己去查找资料,这让我们体会到自学能力的重要性。未来,我们相信我们在拥有一些基本的素质之后,一定能够在代码的路上越走越远。

转载请注明原文地址: https://www.6miu.com/read-64907.html

最新回复(0)