基于NotePad应用做功能扩展
附加功能
- UI美化(设置背景颜色,选中时的笔记背景颜色变换)
- 更换背景
功能解析
-
UI美化(设置背景颜色,选中时的便签背景颜色变换)
NotePad源码中的应用,只有简单的笔记黑色主题。本功能对此进行扩展,给予notePad一个新的主题
-
在AndroidManifest.xml中增加一句代码将NotePad换为白色主题
<activity android:name="NotesList" android:label="@string/title_notes_list" android:theme="@android:style/Theme.Holo.Light"> <activity android:name=".NoteSearch" android:label="NoteSearch" android:theme="@android:style/Theme.Holo.Light" >
-
让笔记的每条笔记都具有自己的背景颜色,所以选择在数据库中增加一个字段“color”用于存放每条笔记的背景颜色。先在NotePad.java 中设置颜色编号
public static final String COLUMN_NAME_BACK_COLOR = "color"; public static final int DEFAULT_COLOR = 0; public static final int YELLOW_COLOR = 1; public static final int BLUE_COLOR = 2; public static final int GREEN_COLOR = 3; public static final int RED_COLOR = 4;
-
在NotePadProvider.java中修改创建数据库的语句
(如果数据库已创建需要将数据库删除重新运行一遍程序)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属性 + ");"); }
-
实例化和设置静态对象的块
static{ ····· // add Maps "color" to "color" sNotesProjectionMap.put( NotePad.Notes.COLUMN_NAME_BACK_COLOR, NotePad.Notes.COLUMN_NAME_BACK_COLOR); ····· }
-
增加创建新笔记时需要执行的语句,给每条笔记设置默认背景颜色
// 笔记背景默认为白色 if (values.containsKey(NotePad.Notes.COLUMN_NAME_BACK_COLOR) == false) { values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, NotePad.Notes.DEFAULT_COLOR); }
-
笔记列表显示时从数据库中读取color的代码,所以在NoteList和NoteSearch中的PROJECTION添加color属性
private static final String[] PROJECTION = new String[] { NotePad.Notes._ID, // 0 NotePad.Notes.COLUMN_NAME_TITLE, // 1 //扩展 显示时间戳 NotePad.Notes.COLUMN_NAME_MODIFICATION_DATE, //扩展 显示笔记背景颜色 NotePad.Notes.COLUMN_NAME_BACK_COLOR, };
-
使用bindView将颜色填充到ListView。新建一个MyCursorAdapter继承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); //从数据库中读取的先前存入的笔记背景颜色的编码,再设置笔记的背景颜色 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; } } }
-
将NoteList和NoteSearch里的适配器改为MyCursorAdapter
MyCursorAdapter adapter = new MyCursorAdapter( this, R.layout.noteslist_item, cursor, dataColumns, viewIDs );
-
新建colors.xml和color_select.xml。选中时的笔记时笔记的背景颜色会改变
<resources> <color name="color1">#be96df</color> </resources>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/color1" android:state_pressed="true"/> </selector>
-
在notelist_item.xml里为控件添加选择器
android:background="@drawable/color_select"
-
模拟器截图
-
-
更换背景颜色
-
为了编辑笔记的时候可以显示背景颜色(显示时能查询到color数据),在NoteEditor.java中增加color属性
private static final String[] PROJECTION = new String[] { NotePad.Notes._ID, NotePad.Notes.COLUMN_NAME_TITLE, NotePad.Notes.COLUMN_NAME_NOTE, //增加 背景颜色 NotePad.Notes.COLUMN_NAME_BACK_COLOR };
-
在onResume()中增加设置背景颜色的代码
//读取颜色数据 if(mCursor!=null){ mCursor.moveToFirst(); int x = mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_BACK_COLOR); int y = mCursor.getInt(x); Log.i("NoteEditor", "color"+y); switch (y){ case NotePad.Notes.DEFAULT_COLOR: mText.setBackgroundColor(Color.rgb(255, 255, 255)); break; case NotePad.Notes.YELLOW_COLOR: mText.setBackgroundColor(Color.rgb(247, 216, 133)); break; case NotePad.Notes.BLUE_COLOR: mText.setBackgroundColor(Color.rgb(165, 202, 237)); break; case NotePad.Notes.GREEN_COLOR: mText.setBackgroundColor(Color.rgb(161, 214, 174)); break; case NotePad.Notes.RED_COLOR: mText.setBackgroundColor(Color.rgb(244, 149, 133)); break; default: mText.setBackgroundColor(Color.rgb(255, 255, 255)); break; } }
-
在editor_options_menu.xml中添加一个更改背景的按钮
<item android:id="@+id/menu_color" android:title="color" android:icon="@drawable/ic_menu_edit" android:showAsAction="always"/>
-
往NoteEditor.java中添加增加上一步新增的选项的执行语句,在onOptionsItemSelected()的switch中添加代码
case R.id.menu_color://跳转改变颜色的activity Intent intent = new Intent(null,mUri); intent.setClass(NoteEditor.this,NoteColor.class); NoteEditor.this.startActivity(intent); break;
-
新建选择背景颜色的布局note_color.xml
<ImageButton android:id="@+id/color_white" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="#ffffff" android:onClick="white"/> <ImageButton android:id="@+id/color_yellow" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="#fdef90" android:onClick="yellow"/> <ImageButton android:id="@+id/color_blue" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="#6dc1ed" android:onClick="blue"/> <ImageButton android:id="@+id/color_green" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="#94e49f" android:onClick="green"/> <ImageButton android:id="@+id/color_red" android:layout_width="0dp" android:layout_height="50dp" android:layout_weight="1" android:background="#f19696" android:onClick="red"/>
-
新建选择颜色的NoteColor.java并注册
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, NotePad.Notes.COLUMN_NAME_BACK_COLOR, }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.note_color); mUri = getIntent().getData(); mCursor = managedQuery( mUri, PROJECTION, null, null, null ); } @Override protected void onResume(){ if(mCursor.moveToFirst()){ color = mCursor.getInt(mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_BACK_COLOR)); Log.i("NoteColor", "before"+color); } super.onResume(); } @Override protected void onPause() { //将修改的颜色存入数据库 super.onPause(); ContentValues values = new ContentValues(); Log.i("NoteColor", "cun"+color); values.put(NotePad.Notes.COLUMN_NAME_BACK_COLOR, color); getContentResolver().update(mUri, values, null, null); int x = mCursor.getColumnIndex(NotePad.Notes.COLUMN_NAME_BACK_COLOR); int y = mCursor.getInt(x); Log.i("NoteColor", "du"+y); } 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(); } }
<activity android:name="NoteColor" android:theme="@android:style/Theme.Holo.Light.Dialog" android:label="Select Color"/>
-
模拟器截图
-
作者 穆昕雨