1.登录功能:进入日记本APP需要登录,默认账号为“admin”,默认密码为“123456”。后续有需要,可以建立数据库,添加注册功能,便可以有多个作者;
2.查看日记功能:登录完成,进入主页面,即显示作者书写的日记列表,点击某个日记标题可进行日记内容的查看、修改和保存;
3.添加日记功能:点击“添加日记”,进入新的日记书写界面。其中,日记书写时间默认为系统当前时间,日记作者默认为admin,对于日记书写时间不可以修改,日记作者可以修改。编辑完成日记内容,点击右上角“保存”按钮进行保存;
4.添加照片功能:在日记书写完成后,需从相册里选择一张照片(Android模拟机的photos),目前有点bug,不选择照片不能进行存储,后续会修改。
5.界面展示:
(1)登录界面:
(2)日记列表界面:
(3)日记书写界面:
1.登录界面的实现其实很简单,如果只有一个作者,不涉及数据库的 *** 作,即可在Activity中进行账号和密码的输入判断。如果需要多个作者,则建立一个数据库,用来存储作者的账号和密码。对于此日记APP,只有一个作者,故在Login(登录的Activity)中,对账号和密码进行判断,登录成功跳转到日记列表界面(MainActivity),“登录”按钮的点击响应事件代码如下:
login.setOnClickListener(new View.OnClickListener() {
@Override
public 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和picture
String 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)