关于Android制作日记本APP的几点建议

1.功能实现和界面展示

1.登录功能:进入日记本APP需要登录,默认账号为“admin”,默认密码为“123456”。后续有需要,可以建立数据库,添加注册功能,便可以有多个作者;
2.查看日记功能:登录完成,进入主页面,即显示作者书写的日记列表,点击某个日记标题可进行日记内容的查看、修改和保存;
3.添加日记功能:点击“添加日记”,进入新的日记书写界面。其中,日记书写时间默认为系统当前时间,日记作者默认为admin,对于日记书写时间不可以修改,日记作者可以修改。编辑完成日记内容,点击右上角“保存”按钮进行保存;
4.添加照片功能:在日记书写完成后,需从相册里选择一张照片(Android模拟机的photos),目前有点bug,不选择照片不能进行存储,后续会修改。
5.界面展示:
(1)登录界面:

(2)日记列表界面:

(3)日记书写界面:

2.登录界面

1.登录界面的实现其实很简单,如果只有一个作者,不涉及数据库的操作,即可在Activity中进行账号和密码的输入判断。如果需要多个作者,则建立一个数据库,用来存储作者的账号和密码。对于此日记APP,只有一个作者,故在Login(登录的Activity)中,对账号和密码进行判断,登录成功跳转到日记列表界面(MainActivity),“登录”按钮的点击响应事件代码如下:

login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//读出用户名和密码并判断是否正确String account=adminEdit.getText().toString();String password=passwordEdit.getText().toString();//用户名和密码正确if(account.equals("admin")&&password.equals("123456")){editor=pref.edit();//“是否保存密码”勾选if(savePassword.isChecked()){editor.putBoolean("save_password",true);editor.putString("account",account);editor.putString("password",password);}else{editor.clear();}//提交完成数据存储editor.apply();//显示登录成功并跳转到主界面活动Toast.makeText(Login.this,"登录成功",Toast.LENGTH_SHORT).show();Intent intent=new Intent(Login.this, MainActivity.class);startActivity(intent);//结束当前活动finish();}//用户名或密码错误else{Toast.makeText(Login.this,"登录失败,请重新输入!",Toast.LENGTH_SHORT).show();}}
});

3.日记存储

日记的存储分为两个部分来讲,一部分是照片存储,另一部分是其余内容存储。
1.其余内容存储。其余内容的存储是比较简单的,首先新建一个新的java类DatabaseHelper(只是我所用的名字,其余名字也可以),继承SQLiteOpenHelper,在其中对数据库和存储日记内容的表进行定义,部分代码如下:

public static final String DB_NAME="NotePad.db";
public static final int VERSION=1;
public static final String TABLE_NAME="Diary";
//建表语句
public static final String CREATE_DIARY="create table Diary(" +"id integer primary key autoincrement," +"title text," +"time text," +"author text," +"content text," +"picture BLOB)";

可以看到,日记的数据库定义包含:id(自增1),title(日记名称),time(系统当前时间),author(日记作者),content(日记内容),picture(照片)。数据库定义完成,接下来便是数据的收集和存储。首先,在日记书写界面,当用户输入相应部分的内容,或者在原有日记的基础上进行修改之后,需要进行数据的收集,(“保存”、“更新”、“删除”和“返回主页面”按钮的点击响应事件)代码如下:

//设置“保存”或者“删除”按钮点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {switch(item.getItemId()){case R.id.save:if(tag==TAG_INSERT) {ContentValues values = new ContentValues();values.put("title", title.getText().toString());values.put("author", author.getText().toString());values.put("content", content.getText().toString());final ByteArrayOutputStream os = new ByteArrayOutputStream();Bitmap bitmap = ((BitmapDrawable)picture.getDrawable()).getBitmap();bitmap.compress(Bitmap.CompressFormat.PNG,100,os);values.put("picture",os.toByteArray());db.insert(TABLE_NAME, null, values);values.clear();Toast.makeText(this, "Save", Toast.LENGTH_SHORT).show();finish();break;}else if(tag==TAG_UPDATE){//修改title、content和pictureString update_title=title.getText().toString();String update_author=author.getText().toString();String update_content=content.getText().toString();ContentValues values=new ContentValues();values.put("title",update_title);values.put("author",update_author);values.put("content",update_content);final ByteArrayOutputStream os = new ByteArrayOutputStream();Bitmap bitmap = ((BitmapDrawable)picture.getDrawable()).getBitmap();bitmap.compress(Bitmap.CompressFormat.PNG,100,os);values.put("picture",os.toByteArray());db.update(TABLE_NAME,values,"id=?",new String[]{String.valueOf(id)});finish();break;}case R.id.delete:if(tag==TAG_UPDATE) {db.delete(TABLE_NAME,"id=?",new String[]{String.valueOf(id)});}Toast.makeText(this,"Delete",Toast.LENGTH_SHORT).show();finish();break;case R.id.goBack:finish();break;default:}return true;
}

对于数据展示,即日记内容的呈现,部分代码如下:

if(cursor.moveToFirst()){String select_title=cursor.getString(cursor.getColumnIndex("title"));String select_author=cursor.getString(cursor.getColumnIndex("author"));String select_content=cursor.getString(cursor.getColumnIndex("content"));title.setText(select_title);author.setText(select_author);content.setText(select_content);byte[] in = cursor.getBlob(cursor.getColumnIndex("picture"));Bitmap bitmap=BitmapFactory.decodeByteArray(in,0,in.length);picture.setImageBitmap(bitmap);
}

2.照片存储。由于数据库定义的数据类行里并没有picture这种存储类型,因而我们需要将照片转换成另一种形式进行存储。在此,我们转换为BLOB类型,在数据库中定义:

"picture BLOB"

而照片在Android中的类型为bitmap类型,对于Android中选择的照片(即bitmap类型)需要转换为BLOB类型,代码如下:

final ByteArrayOutputStream os = new ByteArrayOutputStream();
Bitmap bitmap = ((BitmapDrawable)picture.getDrawable()).getBitmap();
bitmap.compress(Bitmap.CompressFormat.PNG,100,os);
values.put("picture",os.toByteArray());

从数据库中读取照片,代码如下:

byte[] in = cursor.getBlob(cursor.getColumnIndex("picture"));
Bitmap bitmap=BitmapFactory.decodeByteArray(in,0,in.length);

显示在ImageView上,代码如下:

ImageView picture;//照片
picture=findViewById(R.id.detail_picture);
picture.setImageBitmap(bitmap);

至此,照片的存储和读取都完成啦。对于如何打开Android模拟机的photos,在郭霖《第一行代码》中有详细的步骤和说明,感兴趣可以去看一下。

4.系统时间获取和默认作者

日记本APP要求获取系统当前时间,显示在日记界面。对于时间获取,实现代码如下:

TextView time;  //时间
time= findViewById(R.id.detail_time);
time.setText(simpleDateFormat.format(date));

对于默认作者,代码如下:

EditText author; //作者
author= findViewById(R.id.detail_author);
author.setText("admin");

需要注意,时间是不可以手动修改的,而对于默认的作者,在编辑日记的时候可以进行修改,并且会被保存。

5.下载链接

日记本APP除了照片存储有些难度,整体并不是很难,希望可以认真学习一下。最后,附上日记本APP的github地址,代码仍不完善,欢迎指正。
Diary

Android项目实践(二)——日记本APP相关推荐

  1. Android项目实践(三)——天气预报APP

    关于Android制作天气预报APP的几点建议 1.功能实现和界面展示 1.查询天气功能:通过输入地区的adcode码(后续有机会做一下通过输入地区)查询天气情况: 2.添加关注功能:对于某个县级行政 ...

  2. 【Android项目实战 | 从零开始写app(十二)】实现app首页智慧服务热门推荐热门主题、新闻

    说在前面,由于各种adapter,xml布局,bean实体类,Activity,也为了让看懂,代码基本都是"简单粗暴直接不好看",没啥okhttp和util工具类之类的封装,本篇幅 ...

  3. 【Android项目实战 | 从零开始写app一一智慧服务】完结篇系列导航篇、源代码

    目录 文章介绍 涉及知识 系列汇总 项目源代码 文章介绍 本系列小文是一个简单的Android app项目实战,对于刚入门Android 的初学者来说,基础学完了,但是怎么综合的去写一个小app,可能 ...

  4. 【Android项目实战 | 从零开始写app (六) 】用TabLayout+ViewPager搭建App 框架主页面底部导航栏

    本篇实现效果: 搭建app框架的方式有很多,本节主要用TabLayout+ViewPager搭建App框架,这种方式简单易实现,在主页中加载Fragment碎片,实现不同功能页面的切换效果图如下: 文 ...

  5. 【Android项目实战 | 从零开始写app(十三)】实现用户中心模块清除token退出登录信息修改等功能

    五一后,被ji金伤了,哇呜呜,还是得苦逼老老实实打工写代码,看下面吧 本篇实现效果: 实现登录用户名展示到用户中心页面上,并且页面有个人信息,订单列表,修改密码,意见反馈发送到服务端,前面登录后,通过 ...

  6. Android项目实践(四)——音乐播放器APP

    关于Android制作音乐播放器APP的几点建议 1.权限获得 1.在AndroidManifest.xml文件中,做如下声明: <uses-permission android:name=&q ...

  7. Android项目实战:账本APP开发

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 Java项目实战:账本APP服务 ...

  8. Android最佳性能实践(二)——分析内存的使用情况

    由于Android是为移动设备开发的操作系统,我们在开发应用程序的时候应当始终把内存问题充分考虑在内.虽然Android系统拥有垃圾自动回收机制,但这并不意味着我们就可以完全忽略何时去分配或释放内存. ...

  9. Python 项目实践二(生成数据)第二篇

    接着上节继续学习,在本节中,我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这些数据呈现出来.随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向 ...

  10. Android项目实践——短信发送接口的封装与设计

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程:Android开发之从零开始系列 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言:前一段时间公司服务端开发人手不足,而项目 ...

最新文章

  1. python插件下载地址
  2. 执行“conda create -n scrapyEnv python=3.6”,结果出现了“CondaHTTPError: HTTP 000 CONNECTION FAILED for url <h
  3. pdf转word python_【python】python实现PDF转word
  4. Ubuntu下共享目录的设置
  5. 日常生活收缩毛孔几个小妙招 - 健康程序员,至尚生活!
  6. php 批量转换文档编码格式_据说是国内最好的文档格式转换网址~PDF,PPT,EXCEL,WORD互相转换...
  7. delphi 调用php接口_爱站权重查询 API 接口请求调用
  8. GMTC2019|闲鱼-基于Flutter的架构演进与创新
  9. 2020年数模美赛参赛心得总结
  10. 【译】软件设计中的KISS原则
  11. 【科普视频】信号在时域和频域上的区别
  12. 详述白盒测试的逻辑覆盖法的条件组合覆盖及其优缺点
  13. 优雅的编写多线程——原子量
  14. [笔记]PLC可程式模拟器1
  15. 用html画动漫人物,画动漫人物的步骤?
  16. 前后端分离页面500错误,控制台不打印错误日志的错误定位
  17. 4.46-47访问控制4/5
  18. mysql分组语句的子句_MySQL 中的排序与分组 语句
  19. Error in created hook (Promise/async): “TypeError: Cannot read property ‘protocol‘ of undefined“ 的解决
  20. 台达,AS228T,plc程序模板和触摸屏程序模板,目前6个总线伺服,采用CANOPEN,适用于运动轴控制,程序可以在自动的时候暂停进行手动控制

热门文章

  1. 知识图谱(关系网络)概念及常用算法
  2. [计算机网络]计算机网络发展历程,osi7层模型,报文交换
  3. 2021年幼儿园教师招聘:规则性游戏的指导
  4. 老鸟必备 | 如何画出优秀的架构图
  5. python培训总结报告
  6. Copy ‘XXXX‘ to effectively final temp variable
  7. 计算机网络选修课体会600字,上网课的感受600字 上网课的心得体会
  8. mfc切换office样式_VS2015下使用MFC操作Office(Word)
  9. 三地五中心(ldc(逻辑数据中心)单元化)和容灾
  10. 蓝牙怎么调声音大小_苹果蓝牙耳机