安卓记事本实验报告

来源:互联网 发布:查找淘宝用户购买记录 编辑:程序博客网 时间:2024/05/27 09:46

目录

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

原创粉丝点击