该项目是通过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>
未完,待续。。。