安卓记事本实验报告

2 篇文章 0 订阅
2 篇文章 0 订阅

目录

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

  • 0
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值