基于原有的代码进行功能扩展
原有项目代码: notepad-master
本项目在原有项目的基础上增加了时间戳显示和笔记查询两个基础功能,以及美化UI和更改记事本的背景两个扩展功能
-
主要的类:
NotesList类 应用程序的入口,笔记本的首页面会显示笔记的列表
NoteEditor类 编辑笔记内容的Activity
TitleEditor类 编辑笔记标题的Activity
NotePadProvider类 这是笔记本应用的ContentProvider
NoteColor类 用来选择颜色
NoteSearch类 用于实现笔记查询
MyCursorAdapter类 继承SimpleCursorAdapter -
主要的布局文件:
note_editor.xml 笔记主页面布局
noteslist_item.xml 笔记主页面每个列表项布局
title_editor.xml 修改笔记主题布局
note_search.xml 笔记内容查询布局
note_color.xml 对选择颜色界面进行布局 -
主要的菜单文件:
editor_options_menu.xml 编辑笔记内容的菜单布局
list_context_menu.xml 笔记内容编辑上下文菜单布局
list_options_menu.xml 笔记主页面可选菜单布局
修改NotesList.java中PROJECTION的内容,添加modif字段,使其在后面的搜索中才能从SQLite中读取修改时间的字段。
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_TITLE, // 1
//Extended:display time, color
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 2
NotePad.Notes.COLUMN_NAME_BACK_COLOR
};
1.2.第二步:
修改适配器内容,增加dataColumns中装配到ListView的内容,因此要同时增加一个文本框来存放时间。
final String[] dataColumns = { NotePad.Notes.COLUMN_NAME_TITLE , NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE} ;
int[] viewIDs = { android.R.id.text1, R.id.text2};
1.3.第三步:
修改layout文件夹中noteslist_item.xml的内容,增加一个textview组件,因为有两个组件,所以要相应的为他们添加一个布局。
1.4.第四步:
修改NoteEditor.java中updateNote方法中的时间类型。
private final void updateNote(String text, String title) {
// Sets up a map to contain values to be updated in the provider.
ContentValues values = new ContentValues();
Long now = Long.valueOf(System.currentTimeMillis());
SimpleDateFormat sf = new SimpleDateFormat("yy/MM/dd HH:mm");
Date d = new Date(now);
String format = sf.format(d);
values.put(NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, format);
1.5.功能展示:
2.添加笔记查询功能(根据标题查询)
2.1.第一步:
搜索组件在主页面的菜单选项中,在list_options_menu.xml布局文件中添加搜索功能。
2.2.第二步:
新建一个查找笔记内容的布局文件note_search.xml。
2.3.第三步:
在NotesList.java中的onOptionsItemSelected方法中添加search查询的处理。
case R.id.menu_search:
//Find function
//startActivity(new Intent(Intent.ACTION_SEARCH, getIntent().getData()));
Intent intent = new Intent(this, NoteSearch.class);
this.startActivity(intent);
return true;
2.4.第四步:
新建一个NoteSearch.java用于search功能的功能实现。
package com.example.android.notepad;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class NoteSearch extends Activity implements SearchView.OnQueryTextListener
{
ListView listView;
SQLiteDatabase sqLiteDatabase;
private static final String[] PROJECTION = new String[]{
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_TITLE, // 1
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE//时间
};
public boolean onQueryTextSubmit(String query) {
Toast.makeText(this, "you choose:"+query, Toast.LENGTH_SHORT).show();
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_search);
SearchView searchView = findViewById(R.id.search_view);
Intent intent = getIntent();
if (intent.getData() == null) {
intent.setData(NotePad.Notes.CONTENT_URI);
}
listView = findViewById(R.id.list_view);
sqLiteDatabase = new NotePadProvider.DatabaseHelper(this).getReadableDatabase();
//Set the searchview to display the search button
searchView.setSubmitButtonEnabled(true);
//Set the prompt text displayed by default in this searchview
searchView.setQueryHint("search");
searchView.setOnQueryTextListener(this);
}
public boolean onQueryTextChange(String string) {
String selection1 = NotePad.Notes.COLUMN_NAME_TITLE+" like ? or "+NotePad.Notes.COLUMN_NAME_NOTE+" like ?";
String[] selection2 = {"%"+string+"%","%"+string+"%"};
Cursor cursor = sqLiteDatabase.query(
NotePad.Notes.TABLE_NAME,
PROJECTION, // The columns to return from the query
selection1, // The columns for the where clause
selection2, // The values for the where clause
null, // don't group the rows
null, // don't filter by row groups
NotePad.Notes.DEFAULT_SORT_ORDER // The sort order
);
// The names of the cursor columns to display in the view, initialized to the title column
String[] dataColumns = {
NotePad.Notes.COLUMN_NAME_TITLE,
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE
} ;
// The view IDs that will display the cursor columns, initialized to the TextView in
// noteslist_item.xml
int[] viewIDs = {
android.R.id.text1,
android.R.id.text2
};
// Creates the backing adapter for the ListView.
SimpleCursorAdapter adapter
= new SimpleCursorAdapter(
this, // The Context for the ListView
R.layout.noteslist_item, // Points to the XML for a list item
cursor, // The cursor to get items from
dataColumns,
viewIDs
);
// Sets the ListView's adapter to be the cursor adapter that was just created.
listView.setAdapter(adapter);
return true;
}
}
2.5.第五步:
在清单文件AndroidManifest.xml里面注册NoteSearch。
2.6.功能展示: 3.UI美化 3.1.第一步:
给NotesList换个主题,把黑色换成白色,在AndroidManifest.xml中NotesList的Activity中添加。
3.2.第二步:
在NotePad.java中添加:
public static final String COLUMN_NAME_BACK_COLOR = "color";3.3.第三步:
创建数据库表地方添加颜色的字段。
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + NotePad.Notes.TABLE_NAME + " ("
+ NotePad.Notes._ID + " INTEGER PRIMARY KEY,"
+ NotePad.Notes.COLUMN_NAME_TITLE + " TEXT,"
+ NotePad.Notes.COLUMN_NAME_NOTE + " TEXT,"
+ NotePad.Notes.COLUMN_NAME_CREATE_DATE + " INTEGER,"
+ NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE + " INTEGER,"
+ NotePad.Notes.COLUMN_NAME_BACK_COLOR + " INTEGER" //color
+ ");");
}
3.4.第四步:
在NotePad.java中定义:
public static final int DEFAULT_COLOR = 0; //white
public static final int YELLOW_COLOR = 1; //yellow
public static final int BLUE_COLOR = 2; //blue
public static final int GREEN_COLOR = 3; //green
public static final int RED_COLOR = 4; //red
3.5.第五步:
在NotePadProvider.java中添加对其相应的处理,
static中:
sNotesProjectionMap.put(
NotePad.Notes.COLUMN_NAME_BACK_COLOR,
NotePad.Notes.COLUMN_NAME_BACK_COLOR);
insert中:
// Create a new notepad. The background is white by default
if (values.containsKey(NotePad.Notes.COLUMN_NAME_BACK_COLOR) == false) {
values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, NotePad.Notes.DEFAULT_COLOR);
}
3.6.第六步:
自定义一个MyCursorAdapter.java继承SimpleCursorAdapter,将颜色填充到ListView。
package com.example.android.notepad;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.view.View;
import android.widget.SimpleCursorAdapter;
public class MyCursorAdapter extends SimpleCursorAdapter {
public MyCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
}
@Override
public void bindView(View view, Context context, Cursor cursor){
super.bindView(view, context, cursor);
//Get the color data corresponding to the note list from the cursor read from the database, and set the note color
int x = cursor.getInt(cursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_BACK_COLOR));
switch (x){
case NotePad.Notes.DEFAULT_COLOR:
view.setBackgroundColor(Color.rgb(255, 255, 255));
break;
case NotePad.Notes.YELLOW_COLOR:
view.setBackgroundColor(Color.rgb(247, 216, 133));
break;
case NotePad.Notes.BLUE_COLOR:
view.setBackgroundColor(Color.rgb(165, 202, 237));
break;
case NotePad.Notes.GREEN_COLOR:
view.setBackgroundColor(Color.rgb(161, 214, 174));
break;
case NotePad.Notes.RED_COLOR:
view.setBackgroundColor(Color.rgb(244, 149, 133));
break;
default:
view.setBackgroundColor(Color.rgb(255, 255, 255));
break;
}
}
}
3.7.第七步:
在NotesList.java中的PROJECTION添加颜色项。
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_TITLE, // 1
//Extended:display time, color
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 2
NotePad.Notes.COLUMN_NAME_BACK_COLOR
};
3.8.第八步:
将NotesList.java中用的SimpleCursorAdapter改为使用MyCursorAdapter:
// // Creates the backing adapter for the ListView.
// SimpleCursorAdapter adapter
// = new SimpleCursorAdapter(
// this, // The Context for the ListView
// R.layout.noteslist_item, // Points to the XML for a list item
// cursor, // The cursor to get items from
// dataColumns,
// viewIDs
// );
//Modify to a custom adapter that can be filled with color. The custom code is in MyCursorAdapter.java
MyCursorAdapter adapter = new MyCursorAdapter(
this,
R.layout.noteslist_item,
cursor,
dataColumns,
viewIDs
);
3.9.功能展示:
原版:
改版:
在NotesList.java中为PROJECTION中添加颜色项。
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_TITLE, // 1
//Extended:display time, color
NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, // 2
NotePad.Notes.COLUMN_NAME_BACK_COLOR
};
4.2.第二步:
在editor_options_menu.xml中添加一个更改背景的功能选项。
4.3.第三步:
在NoteEditor.java中找到onOptionsItemSelected方法,在菜单的switch中添加:
//Change background color option
case R.id.menu_color:
changeColor();
break;
4.4.第四步:
在NoteEditor.java中添加函数changeColor:
//Jump to the activity changing the color and transfer the URI information to the new activity
private final void changeColor() {
Intent intent = new Intent(null,mUri);
intent.setClass(NoteEditor.this,NoteColor.class);
NoteEditor.this.startActivity(intent);
}
4.5.第五步:
新建布局note_color.xml,垂直线性布局放置5个ImageButton,对选择颜色界面进行布局。
新建资源文件color.xml,添加所需颜色。
4.6.第六步:#fff #FFD885 #A5CAED #A1D6AE #F49585
创建NoteColor.java,用来选择颜色。
package com.example.android.notepad;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class NoteColor extends Activity {
private Cursor mCursor;
private Uri mUri;
private int color;
private static final int COLUMN_INDEX_TITLE = 1;
private static final String[] PROJECTION = new String[] {
NotePad.Notes._ID, // 0
NotePad.Notes.COLUMN_NAME_BACK_COLOR,
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_color);
//Uri passed in from noteeditor
mUri = getIntent().getData();
mCursor = managedQuery(
mUri, // The URI for the note that is to be retrieved.
PROJECTION, // The columns to retrieve
null, // No selection criteria are used, so no where columns are needed.
null, // No where columns are used, so no where values are needed.
null // No sort order is needed.
);
}
@Override
protected void onResume(){
//The execution order is after oncreate
if (mCursor != null) {
mCursor.moveToFirst();
color = mCursor.getInt(COLUMN_INDEX_TITLE);
}
super.onResume();
}
@Override
protected void onPause() {
//After finish(), the selected color is stored in the database
super.onPause();
ContentValues values = new ContentValues();
values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, color);
getContentResolver().update(mUri, values, null, null);
}
public void white(View view){
color = NotePad.Notes.DEFAULT_COLOR;
finish();
}
public void yellow(View view){
color = NotePad.Notes.YELLOW_COLOR;
finish();
}
public void blue(View view){
color = NotePad.Notes.BLUE_COLOR;
finish();
}
public void green(View view){
color = NotePad.Notes.GREEN_COLOR;
finish();
}
public void red(View view){
color = NotePad.Notes.RED_COLOR;
finish();
}
}
4.7.第七步:
在清单文件AndroidManifest.xml里面注册NoteColor
4.8.功能展示:



