该项目是通过contentProvider来对数据库进行增删改查操作。主要是通过action来进行相应的Activity跳转。
TitleEditor类
该类主要是为了输入、修改标题,同时在AndroidMainfest.xml中将该Activity定义成了Dialog弹出模式。
android:theme=”@andorid:style/Theme.Dialog”
具体里面则是通过Uri来返回cursor,进行查询和修改标题。
Cursor mCursor = managedQuery(mUri, PROJECTION, null, null, null);
@Override
protected void onResume() {
super.onResume();
// Initialize the text with the title column from the cursor
if (mCursor != null) {
mCursor.moveToFirst();
mText.setText(mCursor.getString(COLUMN_INDEX_TITLE));
}
}
@Override
protected void onPause() {
super.onPause();
if (mCursor != null) {
// Write the title back to the note
ContentValues values = new ContentValues();
values.put(NoteColumns.TITLE, mText.getText().toString());
getContentResolver().update(mUri, values, null, null);
}
}
//关闭该页面的时候直接finish()掉该Activity即可。
NoteEditor类
先看用于输入文字的自定义EditText内部类:
/**
* A custom EditText that draws lines between each line of text that is displayed.
*/
public static class LinedEditText extends EditText {
private Rect mRect;
private Paint mPaint;
// we need this constructor for LayoutInflater
public LinedEditText(Context context, AttributeSet attrs) {
super(context, attrs);
mRect = new Rect();
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(0x800000FF);
}
@Override
protected void onDraw(Canvas canvas) {
int count = getLineCount();
Rect r = mRect;
Paint paint = mPaint;
for (int i = 0; i < count; i++) {
int baseline = getLineBounds(i, r);
canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
}
super.onDraw(canvas);
}
}
上面的LinedEditText类继承EditText,并重写了里面的方法,类里面的具体实现就不细讲了,主要是看layout布局xml中是如何引用该自定义view组件类的:
<?xml version="1.0" encoding="utf-8"?>
<view
xmlns:android="http://schemas.android.com/apk/res/android"
class="my.yaner.NoteEditor$LinedEditText"
android:id="@+id/note"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
android:padding="5dp"
android:scrollbars="vertical"
android:layout_gravity="top"
android:textSize="22sp"
android:capitalize="sentences">
</view>
这里有一点需要注意,就是在引用LinedEditText类的时候,由于LinedEditText是内部类,所以在调用的时候使用”$” , my.yaner.NoteEditor$LinedEditText, 不过个人采用my.yaner.NoteEditor.inedEditText也可以测试通过,搞不懂。。。
还有一点需要注意的是,如果要是自定义的view组件, <View></View>标签一定不要大小, 应该为自定义的名字,<view></view>,当前其它的也可以,为此这个害我调试了好长时间。
同时,从NoteList类跳转到NoteEdite类的时候,采用了Action跳转的方式。详见代码:
下面截取的方法块是NoteList点击Menu触发的操作:
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.menu_add:
Log.i("yaner", "添加数据");
startActivity(new Intent(Intent.ACTION_INSERT, getIntent().getData()));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
这里采用的是隐式的跳转方式,即定义相应的Action进行跳转。
再看看AndroidMainfest.xml中标签的定义:
<activity android:name=".NoteEditor"
android:theme="@android:style/Theme.Light" <!-- 设置高亮主题背景 -->
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.INSERT"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
未完,待续。。。