目录结构:

MyDiaryActivity.java

  1. package com.zhang.myDiary;
  2.  
  3. import com.zhang.myDiary.DiaryColumn.DiaryClmn;
  4.  
  5. import android.app.Activity;
  6. import android.app.ListActivity;
  7. import android.content.ContentUris;
  8. import android.content.ContentValues;
  9. import android.content.Intent;
  10. import android.database.Cursor;
  11. import android.net.Uri;
  12. import android.os.Bundle;
  13. import android.view.Menu;
  14. import android.view.MenuItem;
  15. import android.view.View;
  16. import android.widget.ListView;
  17. import android.widget.SimpleCursorAdapter;
  18. import android.widget.Toast;
  19.  
  20. public class MyDiaryActivity extends ListActivity {
  21. /** Called when the activity is first created. */
  22.  
  23. public static final int MENU_ITEM_INSERT = Menu.FIRST;
  24. public static final int MENU_ITEM_EDIT = Menu.FIRST + 1;
  25. public static final int MENU_ITEM_DELETE = Menu.FIRST + 2;
  26.  
  27. private static final String PROJECTION[] = new String[] { DiaryClmn._ID,
  28. DiaryClmn.TITLE, DiaryClmn.CREATED };
  29.  
  30. @Override
  31. public void onCreate(Bundle savedInstanceState) {
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.main);
  34.  
  35. setTitle("wyl的diary");
  36. getWindow().setBackgroundDrawableResource(R.drawable.diarybg);
  37. //getIntent(): Return the intent that started this activity.
  38. Intent intent = getIntent();
  39.  
  40. if (intent.getData() == null) {
  41. intent.setData(DiaryClmn.CONTENT_URI);
  42.  
  43. }
  44.  
  45. Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null,
  46. null, DiaryClmn.DEFAULT_SORT_ORDER);
  47.  
  48. SimpleCursorAdapter adapter = new SimpleCursorAdapter(
  49. MyDiaryActivity.this, R.layout.mydiary_row, cursor,
  50. new String[] { DiaryClmn.TITLE, DiaryClmn.CREATED }, new int[] {
  51. R.id.text1, R.id.created });
  52.  
  53. setListAdapter(adapter);
  54. }
  55.  
  56. public boolean onCreateOptionsMenu(Menu menu) {
  57. super.onCreateOptionsMenu(menu);
  58. menu.add(0, MENU_ITEM_INSERT, 0, R.string.menu_insert);
  59. menu.add(0, android.view.Menu.NONE, 1, R.string.menu_insert_2);
  60. return true;
  61. }
  62.  
  63. /**
  64. * This is called right before the menu is shown, every time it is shown
  65. */
  66. public boolean onPrepareOptionsMenu(Menu menu) {
  67.  
  68. super.onPrepareOptionsMenu(menu);
  69. System.out.println("public boolean onPrepareOptionsMenu(Menu menu)");
  70. myToast("public boolean onPrepareOptionsMenu(Menu menu) ");
  71. /*
  72. * getListAdapter():Get the ListAdapter associated with this activity's
  73. * ListView. getCount():How many items are in the data set represented
  74. * by this Adapter.
  75. */
  76.  
  77. final boolean haveItems = getListAdapter().getCount() > 0;
  78. myToast("getListAdapter().getCount()一共有" + getListAdapter().getCount()
  79. + "个");
  80. if (haveItems) {
  81. // getListView():Get the activity's list view widget.
  82. if (getListView().getSelectedItemId() > 0) {
  83. menu.removeGroup(1);
  84.  
  85. Uri uri = ContentUris.withAppendedId(getIntent().getData(),
  86. getListView().getSelectedItemId());
  87.  
  88. Intent intent = new Intent(null, uri);
  89. // TODO 下面这行代码还不知道到底怎么用
  90. menu.add(1, MENU_ITEM_EDIT, 1, "编辑内容").setIntent(intent);
  91. menu.add(1, MENU_ITEM_DELETE, 1, "删除当前日记");
  92.  
  93. }
  94. } else {
  95. menu.removeGroup(1);
  96. }
  97.  
  98. return true;
  99. }
  100.  
  101. /**
  102. * 封装 Toast()方法
  103. *
  104. * @param string
  105. * 要显示的内容
  106. */
  107. private void myToast(String string) {
  108. Toast.makeText(this, string, 1000).show();
  109. }
  110.  
  111. public boolean onOptionsItemSelected(MenuItem item) {
  112.  
  113. switch (item.getItemId()) {
  114. case MENU_ITEM_INSERT:
  115.  
  116. Intent intent0 = new Intent(this, MyDiaryEdit.class);
  117. intent0.setAction(MyDiaryEdit.INSERT_TEXT_ACTION);//设置action,
  118. /*
  119. * getIntent().getData(): Returns,The URI of the data this
  120. * intent is targeting or null.
  121. */
  122. intent0.setData(getIntent().getData());//intent设置URI
  123. startActivity(intent0);
  124. return true;
  125.  
  126. case MENU_ITEM_EDIT:
  127.  
  128. Intent intent1 = new Intent(this, MyDiaryEdit.class);
  129. intent1.setAction(MyDiaryEdit.EDIT_TEXT_ACTION);
  130. intent1.setData(item.getIntent().getData());
  131. startActivity(intent1);
  132. return true;
  133.  
  134. case MENU_ITEM_DELETE:
  135. Uri uri = ContentUris.withAppendedId(getIntent().getData(),
  136. getListView().getSelectedItemId());
  137. getContentResolver().delete(uri, null, null);
  138. rewindView();
  139. }
  140.  
  141. return super.onOptionsItemSelected(item);
  142. }
  143.  
  144. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  145. super.onActivityResult(requestCode, resultCode, data);
  146. }
  147.  
  148. @Override
  149. protected void onListItemClick(ListView l, View v, int position, long id) {
  150. //重要
  151. //Returns: a new URI with the given ID appended to the end of the path
  152. Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
  153. /*
  154. * new Intent.Intent(String action, Uri uri)这种用法还不太熟悉
  155. * 系统会根据第一个参数(action)在清单文件中找对应的activity,如果对应为多个activity,
  156. * 此时就会弹出一个dailog选择Activity
  157. */
  158. startActivity(new Intent(MyDiaryEdit.EDIT_TEXT_ACTION, uri));
  159.  
  160. }
  161.  
  162. private void rewindView() {
  163. // TODO Auto-generated method stub
  164. Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null,
  165. null, DiaryClmn.DEFAULT_SORT_ORDER);
  166.  
  167. SimpleCursorAdapter adapter = new SimpleCursorAdapter(
  168. MyDiaryActivity.this, R.layout.mydiary_row, cursor,
  169. new String[] { DiaryClmn.TITLE, DiaryClmn.CREATED }, new int[] {
  170. R.id.text1, R.id.created });
  171.  
  172. setListAdapter(adapter);
  173.  
  174. }
  175. }

MyDiaryEdit.java

  1. package com.zhang.myDiary;
  2.  
  3. import com.zhang.myDiary.DiaryColumn.DiaryClmn;
  4.  
  5. import android.app.Activity;
  6. import android.content.ContentValues;
  7. import android.content.Intent;
  8. import android.database.Cursor;
  9. import android.graphics.Paint;
  10. import android.net.Uri;
  11. import android.os.Bundle;
  12. import android.util.Log;
  13. import android.view.View;
  14. import android.widget.Button;
  15. import android.widget.EditText;
  16. import android.widget.TextView;
  17. import android.widget.Toast;
  18.  
  19. public class MyDiaryEdit extends Activity {
  20.  
  21. private static final String TAG = "Diary";
  22. public static final String EDIT_TEXT_ACTION = "com.zhang.myDiary.MyDiaryEdit.EDIT_DIARY";
  23. public static final String INSERT_TEXT_ACTION = "com.zhang.myDiary.MyDiaryEdit.action.INSERT_DIARY";
  24.  
  25. private static final String[] projection = new String[] { DiaryClmn._ID,
  26. DiaryClmn.TITLE, DiaryClmn.BODY };
  27.  
  28. private static final int STATE_EDIT = 0;
  29. private static final int STATE_INSERT = 1;
  30.  
  31. private int mState;
  32.  
  33. private Uri mUri;
  34. private Cursor mCursor;
  35.  
  36. private EditText mTitleText;
  37. private EditText mBodyText;
  38. private Button confirmButton, modifyButton;
  39.  
  40. protected void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. setTheme(android.R.style.Theme_Black);
  43. //Return the intent that started this activity.
  44. final Intent intent = getIntent();
  45. final String action = intent.getAction();
  46. setContentView(R.layout.mydiaryedit);//添加对应的layout
  47. System.out.println("intent.getAction():"+intent.getAction());
  48. myToast("intent.getAction():"+intent.getAction());
  49. TextView wyl_tv = (TextView) findViewById(R.id.wyl_txt);
  50. wyl_tv.setText("intent.getAction():"+intent.getAction()+", URI uri = intent.getData(): "+intent.getData());
  51. mTitleText = (EditText) findViewById(R.id.title);
  52. mBodyText = (EditText) findViewById(R.id.body);
  53.  
  54. confirmButton = (Button) findViewById(R.id.confirm);
  55. modifyButton = (Button) findViewById(R.id.modified);
  56.  
  57. if (EDIT_TEXT_ACTION.equals(action)) {
  58. mState = STATE_EDIT;
  59. mTitleText.setEnabled(false);
  60. mBodyText.setEnabled(false);//设置不可编辑
  61. modifyButton.setVisibility(View.VISIBLE);
  62. mUri = intent.getData();
  63. mCursor = managedQuery(mUri, projection, null, null, null);
  64. mCursor.moveToFirst();
  65. String title = mCursor.getString(1);
  66. mTitleText.setTextKeepState(title);
  67. String body = mCursor.getString(2);
  68. mBodyText.setTextKeepState(body);
  69.  
  70. setResult(RESULT_OK, new Intent(MyDiaryEdit.EDIT_TEXT_ACTION, mUri));
  71. setTitle("编辑日记");
  72. } else if (INSERT_TEXT_ACTION.equals(action)) {
  73. mState = STATE_INSERT;
  74. setTitle("新建日记");
  75. } else {
  76.  
  77. Log.e(TAG, "no such action error");
  78. MyDiaryEdit.this.finish();
  79.  
  80. return;
  81. }
  82.  
  83. confirmButton.setOnClickListener(new MyBtnOnClickListen());
  84. modifyButton.setOnClickListener(new MyBtnOnClickListen());
  85.  
  86. }
  87. /**
  88. * 封装 Toast()方法
  89. *
  90. * @param string 要显示的内容
  91. */
  92. private void myToast(String string) {
  93. Toast.makeText(this, string, 1000).show();
  94. }
  95. private class MyBtnOnClickListen implements Button.OnClickListener {
  96.  
  97. @Override
  98. public void onClick(View v) {
  99. // TODO Auto-generated method stub
  100. switch (v.getId()) {
  101. case R.id.confirm:
  102.  
  103. if (mState == STATE_INSERT) {
  104. insertDiary();
  105.  
  106. } else {
  107.  
  108. // mTitleText.setEnabled(true);
  109. // mBodyText.setEnabled(true);
  110. updataDiary();
  111. }
  112. Intent intent = new Intent();
  113. setResult(RESULT_OK, intent);
  114. finish();
  115.  
  116. break;
  117.  
  118. case R.id.modified:
  119. mTitleText.setEnabled(true);
  120. mBodyText.setEnabled(true);
  121. break;
  122. }
  123. }
  124.  
  125. private void insertDiary() {
  126. // TODO Auto-generated method stub
  127. ContentValues values = new ContentValues();
  128.  
  129. String title = mTitleText.getText().toString();
  130. String body = mBodyText.getText().toString();
  131.  
  132. values.put(DiaryClmn.CREATED,
  133. MyDiaryContentProvider.getFormateCreatedDate());
  134. values.put(DiaryClmn.TITLE, title);
  135. values.put(DiaryClmn.BODY, body);
  136.  
  137. getContentResolver().insert(DiaryClmn.CONTENT_URI, values);
  138.  
  139. }
  140.  
  141. private void updataDiary() {
  142. // TODO Auto-generated method stub
  143. ContentValues values = new ContentValues();
  144.  
  145. String title = mTitleText.getText().toString();
  146. String body = mBodyText.getText().toString();
  147.  
  148. values.put(DiaryClmn.CREATED,
  149. MyDiaryContentProvider.getFormateCreatedDate());
  150. values.put(DiaryClmn.TITLE, title);
  151. values.put(DiaryClmn.BODY, body);
  152. getContentResolver().update(mUri, values, null, null);
  153.  
  154. }
  155.  
  156. }
  157. }

  

  

DiaryColumn.java

  1. package com.zhang.myDiary;
  2.  
  3. import java.net.URI;
  4.  
  5. import android.net.Uri;
  6. import android.provider.BaseColumns;
  7. import android.text.StaticLayout;
  8.  
  9. public class DiaryColumn
  10. {
  11.  
  12. public static final String AUTHORITY = "com.zhang.myDiary.Myprovider";
  13.  
  14. public DiaryColumn()
  15. {
  16. }
  17.  
  18. public static final class DiaryClmn implements BaseColumns
  19. {
  20.  
  21. private DiaryClmn(){};
  22.  
  23. public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/diarias");
  24.  
  25. public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.diary";
  26.  
  27. public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.diary";
  28.  
  29. public static final String DEFAULT_SORT_ORDER = "created DESC";
  30.  
  31. public static final String TITLE = "title";
  32.  
  33. public static final String BODY = "body";
  34.  
  35. public static final String CREATED = "created";
  36.  
  37. }
  38. }

MyDiaryContentProvider.java

  1. package com.zhang.myDiary;
  2.  
  3. import java.util.Calendar;
  4. import java.util.HashMap;
  5.  
  6. import com.zhang.myDiary.DiaryColumn.DiaryClmn;
  7.  
  8. import android.content.ContentProvider;
  9. import android.content.ContentUris;
  10. import android.content.ContentValues;
  11. import android.content.Context;
  12. import android.content.UriMatcher;
  13. import android.database.Cursor;
  14. import android.database.SQLException;
  15. import android.database.sqlite.SQLiteDatabase;
  16. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  17. import android.database.sqlite.SQLiteOpenHelper;
  18. import android.database.sqlite.SQLiteQueryBuilder;
  19. import android.net.Uri;
  20. import android.text.TextUtils;
  21. import android.widget.TextView;
  22.  
  23. public class MyDiaryContentProvider extends ContentProvider
  24. {
  25.  
  26. private static final String DATABASE_NAME = "Diarydatabase";
  27. private static final int DATABASE_VERSION = 1;
  28. private static final String DIARY_TABLE_NAME = "diary";
  29.  
  30. private static final int DIARIES = 1;
  31. private static final int DIARY_ID = 2;
  32.  
  33. private MyDiaryBaseHalper myDiaryBaseHalper;
  34.  
  35. private Context context;
  36.  
  37. private static UriMatcher sUriMatcher;
  38. private static HashMap<String,String>mHashMap;
  39.  
  40. static{
  41.  
  42. sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
  43. sUriMatcher.addURI(DiaryColumn.AUTHORITY,"diarias",DIARIES);
  44. sUriMatcher.addURI(DiaryColumn.AUTHORITY, "diarias/#",DIARY_ID);
  45.  
  46. mHashMap=new HashMap<String, String>();
  47. mHashMap.put(DiaryClmn._ID, DiaryClmn._ID);
  48. mHashMap.put(DiaryClmn.TITLE, DiaryClmn.TITLE);
  49. mHashMap.put(DiaryClmn.BODY,DiaryClmn.BODY);
  50. mHashMap.put(DiaryClmn.CREATED, DiaryClmn.CREATED);
  51. }
  52.  
  53. public static class MyDiaryBaseHalper extends SQLiteOpenHelper{
  54.  
  55. public MyDiaryBaseHalper(Context context, String name, CursorFactory factory, int version)
  56. {
  57. super(context, name, factory, version);
  58. // TODO Auto-generated constructor stub
  59. }
  60.  
  61. @Override
  62. public void onCreate(SQLiteDatabase db)
  63. {
  64. // TODO Auto-generated method stub
  65.  
  66. String sql="CREATE TABLE diary("+DiaryClmn._ID+" INTEGER PRIMARY KEY,"+DiaryClmn.TITLE+" TEXT,"+DiaryClmn.BODY+" TEXT,"+DiaryClmn.CREATED+" TEXT"+");";
  67.  
  68. db.execSQL(sql);
  69. }
  70.  
  71. @Override
  72. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  73. {
  74. // TODO Auto-generated method stub
  75. db.execSQL("DROP TABLE IF EXISTS diary");
  76. onCreate(db);
  77. }
  78.  
  79. }
  80.  
  81. @Override
  82. public boolean onCreate()
  83. {
  84. // TODO Auto-generated method stub
  85. myDiaryBaseHalper=new MyDiaryBaseHalper(getContext(), DATABASE_NAME, null,DATABASE_VERSION);
  86. return true;
  87. }
  88.  
  89. @Override
  90. public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
  91. {
  92. // TODO Auto-generated method stub
  93. SQLiteQueryBuilder dp=new SQLiteQueryBuilder();
  94.  
  95. switch (sUriMatcher.match(uri))
  96. {
  97. case DIARIES :
  98.  
  99. dp.setTables(DIARY_TABLE_NAME);
  100. dp.setProjectionMap(mHashMap);
  101. break;
  102.  
  103. case DIARY_ID:
  104. dp.setTables(DIARY_TABLE_NAME);
  105. dp.setProjectionMap(mHashMap);
  106. dp.appendWhere(DiaryClmn._ID+"="+uri.getPathSegments().get(1));
  107. break;
  108. default:
  109. throw new IllegalArgumentException("错误 的uri:"+uri);
  110. }
  111.  
  112. String olderBY;
  113. if (TextUtils.isEmpty(sortOrder))
  114. {
  115. olderBY=DiaryClmn.DEFAULT_SORT_ORDER;
  116. }else {
  117. olderBY=sortOrder;
  118. }
  119.  
  120. SQLiteDatabase db=myDiaryBaseHalper.getReadableDatabase();
  121.  
  122. Cursor cursor=dp.query(db, projection, selection, selectionArgs, null,null, olderBY);
  123. cursor.setNotificationUri(getContext().getContentResolver(), uri);
  124. return cursor;
  125. }
  126.  
  127. @Override
  128. public String getType(Uri uri)
  129. {
  130. // TODO Auto-generated method stub
  131. switch (sUriMatcher.match(uri))
  132. {
  133. case DIARIES:
  134.  
  135. return DiaryClmn.CONTENT_ITEM_TYPE;
  136. case DIARY_ID:
  137.  
  138. return DiaryClmn.CONTENT_ITEM_TYPE;
  139.  
  140. default:
  141. throw new IllegalArgumentException("Unknown URI " + uri);
  142. }
  143.  
  144. }
  145.  
  146. @Override
  147. public Uri insert(Uri uri, ContentValues values)
  148. {
  149. // TODO Auto-generated method stub
  150. SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase();
  151.  
  152. long rwId=db.insert(DIARY_TABLE_NAME, DiaryClmn.BODY, values);
  153.  
  154. if (rwId>0)
  155. {
  156. Uri rwIdUri=ContentUris.withAppendedId(DiaryClmn.CONTENT_URI, rwId);
  157.  
  158. getContext().getContentResolver().notifyChange(rwIdUri,null);
  159.  
  160. return rwIdUri;
  161. }
  162. throw new SQLException("Failed to insert row into " + uri);
  163. }
  164.  
  165. @Override
  166. public int delete(Uri uri, String selection, String[] selectionArgs)
  167. {
  168. // TODO Auto-generated method stub
  169. SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase();
  170.  
  171. String rwId=uri.getPathSegments().get(1);
  172.  
  173. return db.delete(DIARY_TABLE_NAME, selection+"="+rwId,null);
  174. }
  175.  
  176. @Override
  177. public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
  178. {
  179. // TODO Auto-generated method stub
  180.  
  181. SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase();
  182.  
  183. String rwId=uri.getPathSegments().get(1);
  184. return db.update(DIARY_TABLE_NAME, values, DiaryClmn._ID+"="+rwId,null);
  185.  
  186. }
  187.  
  188. public static String getFormateCreatedDate() {
  189. Calendar calendar = Calendar.getInstance();
  190. String created = calendar.get(Calendar.YEAR) + "年"
  191. + calendar.get(Calendar.MONTH) + "月"
  192. + calendar.get(Calendar.DAY_OF_MONTH) + "日"
  193. + calendar.get(Calendar.HOUR_OF_DAY) + "时"
  194. + calendar.get(Calendar.MINUTE) + "分";
  195. return created;
  196. }
  197.  
  198. }

main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:layout_gravity="center_vertical"
  6. android:orientation="vertical" >
  7.  
  8. <ListView
  9. android:id="@+id/android:list"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:smoothScrollbar="true" />
  13.  
  14. <TextView
  15. android:id="@+id/android:empty"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:textColor="#000000"
  19. android:textStyle="bold"
  20. android:text="您还没有开始写日记呢!点击下边的Menu按钮开始写日记吧:)" />
  21.  
  22. </LinearLayout>

mydiary_row.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/row"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent" >
  6.  
  7. <TextView
  8. android:id="@+id/text1"
  9. android:layout_width="wrap_content"
  10. android:layout_height="30px"
  11. android:layout_marginTop="10dip"
  12. android:maxWidth="200dip"
  13. android:text="第一组第一项"
  14. android:textColor="#000000"
  15. android:textSize="22sp" />
  16.  
  17. <TextView
  18. android:id="@+id/created"
  19. android:layout_width="wrap_content"
  20. android:layout_height="35px"
  21. android:layout_alignParentRight="true"
  22. android:layout_marginLeft="10dip"
  23. android:layout_marginTop="10dip"
  24. android:text="2012年4月2号"
  25. android:textColor="#000000" />
  26.  
  27. </RelativeLayout>

mydiaryedit.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6.  
  7. <LinearLayout
  8. android:layout_width="0dip"
  9. android:layout_height="0dip"
  10. android:focusable="true"
  11. android:focusableInTouchMode="true" />
  12.  
  13. <LinearLayout
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:orientation="vertical" >
  17.  
  18. <TextView
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:padding="2px"
  22. android:text="@string/title" />
  23.  
  24. <EditText
  25. android:id="@+id/title"
  26. android:layout_width="fill_parent"
  27. android:layout_height="wrap_content"
  28. android:textColor="#000000" />
  29. </LinearLayout>
  30.  
  31. <LinearLayout
  32. android:layout_width="fill_parent"
  33. android:layout_height="fill_parent"
  34. android:orientation="vertical" >
  35.  
  36. <TextView
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:text="@string/body" />
  40.  
  41. <EditText
  42. android:id="@+id/body"
  43. android:layout_width="fill_parent"
  44. android:layout_height="wrap_content"
  45.  
  46. android:singleLine="false"
  47. android:textColor="#000000" />
  48.  
  49. <RelativeLayout
  50. android:layout_width="fill_parent"
  51. android:layout_height="wrap_content" >
  52.  
  53. <Button
  54. android:id="@+id/modified"
  55. android:layout_width="wrap_content"
  56. android:layout_height="wrap_content"
  57. android:layout_alignParentBottom="true"
  58. android:text="click me!编辑"
  59. android:visibility="invisible" >
  60. </Button>
  61.  
  62. <Button
  63. android:id="@+id/confirm"
  64. android:layout_width="wrap_content"
  65. android:layout_height="wrap_content"
  66. android:layout_alignParentRight="true"
  67. android:layout_alignTop="@+id/modified"
  68. android:text=" 确定 " />
  69. </RelativeLayout>
  70. </LinearLayout>
  71.  
  72. </LinearLayout>

strings.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6.  
  7. <LinearLayout
  8. android:layout_width="0dip"
  9. android:layout_height="0dip"
  10. android:focusable="true"
  11. android:focusableInTouchMode="true" />
  12.  
  13. <LinearLayout
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:orientation="vertical" >
  17.  
  18. <TextView
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:padding="2px"
  22. android:text="@string/title" />
  23.  
  24. <EditText
  25. android:id="@+id/title"
  26. android:layout_width="fill_parent"
  27. android:layout_height="wrap_content"
  28. android:textColor="#000000" />
  29. </LinearLayout>
  30.  
  31. <LinearLayout
  32. android:layout_width="fill_parent"
  33. android:layout_height="fill_parent"
  34. android:orientation="vertical" >
  35.  
  36. <TextView
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:text="@string/body" />
  40.  
  41. <EditText
  42. android:id="@+id/body"
  43. android:layout_width="fill_parent"
  44. android:layout_height="wrap_content"
  45.  
  46. android:singleLine="false"
  47. android:textColor="#000000" />
  48.  
  49. <RelativeLayout
  50. android:layout_width="fill_parent"
  51. android:layout_height="wrap_content" >
  52.  
  53. <Button
  54. android:id="@+id/modified"
  55. android:layout_width="wrap_content"
  56. android:layout_height="wrap_content"
  57. android:layout_alignParentBottom="true"
  58. android:text="click me!编辑"
  59. android:visibility="invisible" >
  60. </Button>
  61.  
  62. <Button
  63. android:id="@+id/confirm"
  64. android:layout_width="wrap_content"
  65. android:layout_height="wrap_content"
  66. android:layout_alignParentRight="true"
  67. android:layout_alignTop="@+id/modified"
  68. android:text=" 确定 " />
  69. </RelativeLayout>
  70. </LinearLayout>
  71.  
  72. </LinearLayout>

清单文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.zhang.myDiary"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk android:minSdkVersion="7" />
  8.  
  9. <application
  10. android:icon="@drawable/ic_launcher"
  11. android:label="@string/app_name" >
  12. <provider
  13. android:name="MyDiaryContentProvider"
  14. android:authorities="com.zhang.myDiary.Myprovider" />
  15.  
  16. <activity
  17. android:name=".MyDiaryActivity"
  18. >
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21.  
  22. <category android:name="android.intent.category.LAUNCHER" />
  23. </intent-filter>
  24. </activity>
  25. <activity
  26. android:name="com.zhang.myDiary.MyDiaryEdit"
  27. android:label="@string/title_diary"
  28. android:theme="@android:style/Theme.Light" >
  29. <intent-filter>
  30. <action android:name="com.zhang.myDiary.MyDiaryEdit.EDIT_DIARY" />
  31.  
  32. <category android:name="android.intent.category.DEFAULT" />
  33.  
  34. <data android:mimeType="vnd.android.cursor.item/vnd.google.diary"/>
  35. </intent-filter>
  36. <intent-filter>
  37. <action android:name="com.zhang.myDiary.MyDiaryEdit.action.INSERT_DIARY" />
  38.  
  39. <category android:name="android.intent.category.DEFAULT" />
  40.  
  41. <data android:mimeType="vnd.android.cursor.dir/vnd.google.diary" />
  42. </intent-filter>
  43. </activity>
  44. </application>
  45.  
  46. </manifest>

使用contentprovider实现的日记(转)的更多相关文章

  1. 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider

    数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供 ...

  2. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/1873 ...

  3. 【Android开发日记】之入门篇(七)——Android数据存储(上)

    在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ...

  4. 【Android开发日记】之入门篇(八)——Android数据存储(下)

    废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...

  5. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  6. 基础总结篇之八:创建及调用自己的ContentProvider

    转自:http://blog.csdn.net/wellsoho/article/details/49494141 若不能坚持到底,即使是朽木也不能折断:只要坚持不停地用刀刻,就算是金属玉石也可以雕出 ...

  7. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  8. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  9. 微信小程序开发日记——高仿知乎日报(上)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

随机推荐

  1. HDU 1796 容斥原理 How many integers can you find

    题目连接   http://acm.hdu.edu.cn/showproblem.php?pid=1796 处男容斥原理  纪念一下  TMD看了好久才明白DFS... 先贴代码后解释 #includ ...

  2. css优先级及权重值

    优先级: 外部样式表 内部样式表(位于<head>标签内部 内联样式(在HTML元素内部)优先权最高 内联样式>内部样式=外部样式(看具体引入位置,解析的先后) 权重值: 第一等:内 ...

  3. 用反射写自己的DataTable转为对应的Mod

    之前写过类似的方法,今天做项目的时候又遇到了,以前的代码没有保存,导致又得重新写 场景:当我们定义自己的很多模型(Mods)的时候,而数据库读取出来的却是DataSet,DataTable类型的时候, ...

  4. jquery的链式操作以及事件绑定

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. js中定义用字符串拼接起来的变量名的变量

    用对象的形式 你的问题可以通过js的对象实现 var ovar = {}; for(var i=0;i<10;i++){ ovar['var_'+i]=''; } 3用数组的形式 var arr ...

  6. Internet Explorer 11(IE11)无法切换第三方输入法

    Windows 8.1搭载了新的IE11版本,还发布了IE11 for Windows 7. IE11除了支持全尺寸Win设备以外,还比IE10更快速流畅,支持3D等高性能的浏览体验.全新F12开发者 ...

  7. myeclipse设置凝视

    Window-perferences--java--Code Style--Code Templates--Commments 类凝视:Types /** *@desc *@author haozk ...

  8. POJ 1330 Nearest Common Ancestors LCA题解

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19728   Accept ...

  9. POJ 1410 Intersection(线段相交&amp;&amp;推断点在矩形内&amp;&amp;坑爹)

    Intersection 大意:给你一条线段,给你一个矩形,问是否相交. 相交:线段全然在矩形内部算相交:线段与矩形随意一条边不规范相交算相交. 思路:知道详细的相交规则之后题事实上是不难的,可是还有 ...

  10. 饭卡------HDOJ杭电2546(还是01背包!!!!!!)

    Problem Description 电子科大本部食堂的饭卡有一种非常诡异的设计,即在购买之前推断剩余金额. 假设购买一个商品之前,卡上的剩余金额大于或等于5元,就一定能够购买成功(即使购买后卡上剩 ...