android中notePad示例项目源码分析

 该项目是通过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>


未完,待续。。。

你可能感兴趣的:(android,layout,null,action,Constructor,encoding)