目录结构:

MyDiaryActivity.java

package com.zhang.myDiary;

import com.zhang.myDiary.DiaryColumn.DiaryClmn;

import android.app.Activity;
import android.app.ListActivity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast; public class MyDiaryActivity extends ListActivity {
/** Called when the activity is first created. */ public static final int MENU_ITEM_INSERT = Menu.FIRST;
public static final int MENU_ITEM_EDIT = Menu.FIRST + 1;
public static final int MENU_ITEM_DELETE = Menu.FIRST + 2; private static final String PROJECTION[] = new String[] { DiaryClmn._ID,
DiaryClmn.TITLE, DiaryClmn.CREATED }; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); setTitle("wyl的diary");
getWindow().setBackgroundDrawableResource(R.drawable.diarybg);
//getIntent(): Return the intent that started this activity.
Intent intent = getIntent(); if (intent.getData() == null) {
intent.setData(DiaryClmn.CONTENT_URI); } Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null,
null, DiaryClmn.DEFAULT_SORT_ORDER); SimpleCursorAdapter adapter = new SimpleCursorAdapter(
MyDiaryActivity.this, R.layout.mydiary_row, cursor,
new String[] { DiaryClmn.TITLE, DiaryClmn.CREATED }, new int[] {
R.id.text1, R.id.created }); setListAdapter(adapter);
} public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_ITEM_INSERT, 0, R.string.menu_insert);
menu.add(0, android.view.Menu.NONE, 1, R.string.menu_insert_2);
return true;
} /**
* This is called right before the menu is shown, every time it is shown
*/
public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu);
System.out.println("public boolean onPrepareOptionsMenu(Menu menu)");
myToast("public boolean onPrepareOptionsMenu(Menu menu) ");
/*
* getListAdapter():Get the ListAdapter associated with this activity's
* ListView. getCount():How many items are in the data set represented
* by this Adapter.
*/ final boolean haveItems = getListAdapter().getCount() > 0;
myToast("getListAdapter().getCount()一共有" + getListAdapter().getCount()
+ "个");
if (haveItems) {
// getListView():Get the activity's list view widget.
if (getListView().getSelectedItemId() > 0) {
menu.removeGroup(1); Uri uri = ContentUris.withAppendedId(getIntent().getData(),
getListView().getSelectedItemId()); Intent intent = new Intent(null, uri);
// TODO 下面这行代码还不知道到底怎么用
menu.add(1, MENU_ITEM_EDIT, 1, "编辑内容").setIntent(intent);
menu.add(1, MENU_ITEM_DELETE, 1, "删除当前日记"); }
} else {
menu.removeGroup(1);
} return true;
} /**
* 封装 Toast()方法
*
* @param string
* 要显示的内容
*/
private void myToast(String string) {
Toast.makeText(this, string, 1000).show();
} public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) {
case MENU_ITEM_INSERT: Intent intent0 = new Intent(this, MyDiaryEdit.class);
intent0.setAction(MyDiaryEdit.INSERT_TEXT_ACTION);//设置action,
/*
* getIntent().getData(): Returns,The URI of the data this
* intent is targeting or null.
*/
intent0.setData(getIntent().getData());//intent设置URI
startActivity(intent0);
return true; case MENU_ITEM_EDIT: Intent intent1 = new Intent(this, MyDiaryEdit.class);
intent1.setAction(MyDiaryEdit.EDIT_TEXT_ACTION);
intent1.setData(item.getIntent().getData());
startActivity(intent1);
return true; case MENU_ITEM_DELETE:
Uri uri = ContentUris.withAppendedId(getIntent().getData(),
getListView().getSelectedItemId());
getContentResolver().delete(uri, null, null);
rewindView();
} return super.onOptionsItemSelected(item);
} protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
} @Override
protected void onListItemClick(ListView l, View v, int position, long id) {
//重要
//Returns: a new URI with the given ID appended to the end of the path
Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
/*
* new Intent.Intent(String action, Uri uri)这种用法还不太熟悉
* 系统会根据第一个参数(action)在清单文件中找对应的activity,如果对应为多个activity,
* 此时就会弹出一个dailog选择Activity
*/
startActivity(new Intent(MyDiaryEdit.EDIT_TEXT_ACTION, uri)); } private void rewindView() {
// TODO Auto-generated method stub
Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null,
null, DiaryClmn.DEFAULT_SORT_ORDER); SimpleCursorAdapter adapter = new SimpleCursorAdapter(
MyDiaryActivity.this, R.layout.mydiary_row, cursor,
new String[] { DiaryClmn.TITLE, DiaryClmn.CREATED }, new int[] {
R.id.text1, R.id.created }); setListAdapter(adapter); }
}

MyDiaryEdit.java

package com.zhang.myDiary;

import com.zhang.myDiary.DiaryColumn.DiaryClmn;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class MyDiaryEdit extends Activity { private static final String TAG = "Diary";
public static final String EDIT_TEXT_ACTION = "com.zhang.myDiary.MyDiaryEdit.EDIT_DIARY";
public static final String INSERT_TEXT_ACTION = "com.zhang.myDiary.MyDiaryEdit.action.INSERT_DIARY"; private static final String[] projection = new String[] { DiaryClmn._ID,
DiaryClmn.TITLE, DiaryClmn.BODY }; private static final int STATE_EDIT = 0;
private static final int STATE_INSERT = 1; private int mState; private Uri mUri;
private Cursor mCursor; private EditText mTitleText;
private EditText mBodyText;
private Button confirmButton, modifyButton; protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme_Black);
//Return the intent that started this activity.
final Intent intent = getIntent();
final String action = intent.getAction();
setContentView(R.layout.mydiaryedit);//添加对应的layout
System.out.println("intent.getAction():"+intent.getAction());
myToast("intent.getAction():"+intent.getAction());
TextView wyl_tv = (TextView) findViewById(R.id.wyl_txt);
wyl_tv.setText("intent.getAction():"+intent.getAction()+", URI uri = intent.getData(): "+intent.getData());
mTitleText = (EditText) findViewById(R.id.title);
mBodyText = (EditText) findViewById(R.id.body); confirmButton = (Button) findViewById(R.id.confirm);
modifyButton = (Button) findViewById(R.id.modified); if (EDIT_TEXT_ACTION.equals(action)) {
mState = STATE_EDIT;
mTitleText.setEnabled(false);
mBodyText.setEnabled(false);//设置不可编辑
modifyButton.setVisibility(View.VISIBLE);
mUri = intent.getData();
mCursor = managedQuery(mUri, projection, null, null, null);
mCursor.moveToFirst();
String title = mCursor.getString(1);
mTitleText.setTextKeepState(title);
String body = mCursor.getString(2);
mBodyText.setTextKeepState(body); setResult(RESULT_OK, new Intent(MyDiaryEdit.EDIT_TEXT_ACTION, mUri));
setTitle("编辑日记");
} else if (INSERT_TEXT_ACTION.equals(action)) {
mState = STATE_INSERT;
setTitle("新建日记");
} else { Log.e(TAG, "no such action error");
MyDiaryEdit.this.finish(); return;
} confirmButton.setOnClickListener(new MyBtnOnClickListen());
modifyButton.setOnClickListener(new MyBtnOnClickListen()); }
/**
* 封装 Toast()方法
*
* @param string 要显示的内容
*/
private void myToast(String string) {
Toast.makeText(this, string, 1000).show();
}
private class MyBtnOnClickListen implements Button.OnClickListener { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.confirm: if (mState == STATE_INSERT) {
insertDiary(); } else { // mTitleText.setEnabled(true);
// mBodyText.setEnabled(true);
updataDiary();
}
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish(); break; case R.id.modified:
mTitleText.setEnabled(true);
mBodyText.setEnabled(true);
break;
}
} private void insertDiary() {
// TODO Auto-generated method stub
ContentValues values = new ContentValues(); String title = mTitleText.getText().toString();
String body = mBodyText.getText().toString(); values.put(DiaryClmn.CREATED,
MyDiaryContentProvider.getFormateCreatedDate());
values.put(DiaryClmn.TITLE, title);
values.put(DiaryClmn.BODY, body); getContentResolver().insert(DiaryClmn.CONTENT_URI, values); } private void updataDiary() {
// TODO Auto-generated method stub
ContentValues values = new ContentValues(); String title = mTitleText.getText().toString();
String body = mBodyText.getText().toString(); values.put(DiaryClmn.CREATED,
MyDiaryContentProvider.getFormateCreatedDate());
values.put(DiaryClmn.TITLE, title);
values.put(DiaryClmn.BODY, body);
getContentResolver().update(mUri, values, null, null); } }
}

  

  

DiaryColumn.java

package com.zhang.myDiary;

import java.net.URI;

import android.net.Uri;
import android.provider.BaseColumns;
import android.text.StaticLayout; public class DiaryColumn
{ public static final String AUTHORITY = "com.zhang.myDiary.Myprovider"; public DiaryColumn()
{
} public static final class DiaryClmn implements BaseColumns
{ private DiaryClmn(){}; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/diarias"); public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.diary"; public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.diary"; public static final String DEFAULT_SORT_ORDER = "created DESC"; public static final String TITLE = "title"; public static final String BODY = "body"; public static final String CREATED = "created"; }
}

MyDiaryContentProvider.java

package com.zhang.myDiary;

import java.util.Calendar;
import java.util.HashMap; import com.zhang.myDiary.DiaryColumn.DiaryClmn; import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.widget.TextView; public class MyDiaryContentProvider extends ContentProvider
{ private static final String DATABASE_NAME = "Diarydatabase";
private static final int DATABASE_VERSION = 1;
private static final String DIARY_TABLE_NAME = "diary"; private static final int DIARIES = 1;
private static final int DIARY_ID = 2; private MyDiaryBaseHalper myDiaryBaseHalper; private Context context; private static UriMatcher sUriMatcher;
private static HashMap<String,String>mHashMap; static{ sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI(DiaryColumn.AUTHORITY,"diarias",DIARIES);
sUriMatcher.addURI(DiaryColumn.AUTHORITY, "diarias/#",DIARY_ID); mHashMap=new HashMap<String, String>();
mHashMap.put(DiaryClmn._ID, DiaryClmn._ID);
mHashMap.put(DiaryClmn.TITLE, DiaryClmn.TITLE);
mHashMap.put(DiaryClmn.BODY,DiaryClmn.BODY);
mHashMap.put(DiaryClmn.CREATED, DiaryClmn.CREATED);
} public static class MyDiaryBaseHalper extends SQLiteOpenHelper{ public MyDiaryBaseHalper(Context context, String name, CursorFactory factory, int version)
{
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db)
{
// TODO Auto-generated method stub String sql="CREATE TABLE diary("+DiaryClmn._ID+" INTEGER PRIMARY KEY,"+DiaryClmn.TITLE+" TEXT,"+DiaryClmn.BODY+" TEXT,"+DiaryClmn.CREATED+" TEXT"+");"; db.execSQL(sql);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS diary");
onCreate(db);
} } @Override
public boolean onCreate()
{
// TODO Auto-generated method stub
myDiaryBaseHalper=new MyDiaryBaseHalper(getContext(), DATABASE_NAME, null,DATABASE_VERSION);
return true;
} @Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
{
// TODO Auto-generated method stub
SQLiteQueryBuilder dp=new SQLiteQueryBuilder(); switch (sUriMatcher.match(uri))
{
case DIARIES : dp.setTables(DIARY_TABLE_NAME);
dp.setProjectionMap(mHashMap);
break; case DIARY_ID:
dp.setTables(DIARY_TABLE_NAME);
dp.setProjectionMap(mHashMap);
dp.appendWhere(DiaryClmn._ID+"="+uri.getPathSegments().get(1));
break;
default:
throw new IllegalArgumentException("错误 的uri:"+uri);
} String olderBY;
if (TextUtils.isEmpty(sortOrder))
{
olderBY=DiaryClmn.DEFAULT_SORT_ORDER;
}else {
olderBY=sortOrder;
} SQLiteDatabase db=myDiaryBaseHalper.getReadableDatabase(); Cursor cursor=dp.query(db, projection, selection, selectionArgs, null,null, olderBY);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
} @Override
public String getType(Uri uri)
{
// TODO Auto-generated method stub
switch (sUriMatcher.match(uri))
{
case DIARIES: return DiaryClmn.CONTENT_ITEM_TYPE;
case DIARY_ID: return DiaryClmn.CONTENT_ITEM_TYPE; default:
throw new IllegalArgumentException("Unknown URI " + uri);
} } @Override
public Uri insert(Uri uri, ContentValues values)
{
// TODO Auto-generated method stub
SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase(); long rwId=db.insert(DIARY_TABLE_NAME, DiaryClmn.BODY, values); if (rwId>0)
{
Uri rwIdUri=ContentUris.withAppendedId(DiaryClmn.CONTENT_URI, rwId); getContext().getContentResolver().notifyChange(rwIdUri,null); return rwIdUri;
}
throw new SQLException("Failed to insert row into " + uri);
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs)
{
// TODO Auto-generated method stub
SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase(); String rwId=uri.getPathSegments().get(1); return db.delete(DIARY_TABLE_NAME, selection+"="+rwId,null);
} @Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
{
// TODO Auto-generated method stub SQLiteDatabase db=myDiaryBaseHalper.getWritableDatabase(); String rwId=uri.getPathSegments().get(1);
return db.update(DIARY_TABLE_NAME, values, DiaryClmn._ID+"="+rwId,null); } public static String getFormateCreatedDate() {
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "年"
+ calendar.get(Calendar.MONTH) + "月"
+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
+ calendar.get(Calendar.HOUR_OF_DAY) + "时"
+ calendar.get(Calendar.MINUTE) + "分";
return created;
} }

main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:orientation="vertical" > <ListView
android:id="@+id/android:list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:smoothScrollbar="true" /> <TextView
android:id="@+id/android:empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textStyle="bold"
android:text="您还没有开始写日记呢!点击下边的Menu按钮开始写日记吧:)" /> </LinearLayout>

mydiary_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row"
android:layout_width="fill_parent"
android:layout_height="fill_parent" > <TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="30px"
android:layout_marginTop="10dip"
android:maxWidth="200dip"
android:text="第一组第一项"
android:textColor="#000000"
android:textSize="22sp" /> <TextView
android:id="@+id/created"
android:layout_width="wrap_content"
android:layout_height="35px"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dip"
android:layout_marginTop="10dip"
android:text="2012年4月2号"
android:textColor="#000000" /> </RelativeLayout>

mydiaryedit.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="0dip"
android:layout_height="0dip"
android:focusable="true"
android:focusableInTouchMode="true" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2px"
android:text="@string/title" /> <EditText
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#000000" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/body" /> <EditText
android:id="@+id/body"
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:singleLine="false"
android:textColor="#000000" /> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" > <Button
android:id="@+id/modified"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="click me!编辑"
android:visibility="invisible" >
</Button> <Button
android:id="@+id/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/modified"
android:text=" 确定 " />
</RelativeLayout>
</LinearLayout> </LinearLayout>

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <LinearLayout
android:layout_width="0dip"
android:layout_height="0dip"
android:focusable="true"
android:focusableInTouchMode="true" /> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2px"
android:text="@string/title" /> <EditText
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#000000" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/body" /> <EditText
android:id="@+id/body"
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:singleLine="false"
android:textColor="#000000" /> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" > <Button
android:id="@+id/modified"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="click me!编辑"
android:visibility="invisible" >
</Button> <Button
android:id="@+id/confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/modified"
android:text=" 确定 " />
</RelativeLayout>
</LinearLayout> </LinearLayout>

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhang.myDiary"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<provider
android:name="MyDiaryContentProvider"
android:authorities="com.zhang.myDiary.Myprovider" /> <activity
android:name=".MyDiaryActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.zhang.myDiary.MyDiaryEdit"
android:label="@string/title_diary"
android:theme="@android:style/Theme.Light" >
<intent-filter>
<action android:name="com.zhang.myDiary.MyDiaryEdit.EDIT_DIARY" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.diary"/>
</intent-filter>
<intent-filter>
<action android:name="com.zhang.myDiary.MyDiaryEdit.action.INSERT_DIARY" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/vnd.google.diary" />
</intent-filter>
</activity>
</application> </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. 面试之ajax原理(转载)

    总结1 总结2 AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术, 是几种原有技术的结合体. ...

  2. Maven导入时,Cannot change version of project facet Dynamic Web Module to 3.0.

    今天手贱,在eclipse里面把项目删掉了,重新maven导入时,报出Cannot change version of project facet Dynamic Web Module to 3.0. ...

  3. 使用VS创建WebPart部件,并部署到SP(待修改)

    http://www.cnblogs.com/mingmingruyuedlut/archive/2012/12/02/2789488.html

  4. JavaBean的一个小例子

    一.创建一个javaBean类: UseBean package com.oncall24h.ruchi; import java.io.Serializable; public class UseB ...

  5. 转:C++:从子类访问父类的私有函数

    众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能.从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员更 ...

  6. Agg学习笔记

    很久前就听一大牛说起Agg,据说是一个架构极度牛B的2D引擎,沉寂了许久,最后花了两周时间走马观花地把它过了一遍.果然如那大牛所言,这家伙简直就是巧夺天工的艺术品.今天稍稍瞄了一下Google扔出来的 ...

  7. iOS-容易造成循环引用的三种场景

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引 用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都 ...

  8. Android FragmentPagerAdapter和FragmentStatePagerAdapter的区别

    FragmentPagerAdapter官方解释: This version of the pager is best for use when there are a handful of typi ...

  9. (记录前面算过的后面仍然会用的数减小复杂度)A - AC Me

    Description Ignatius is doing his homework now. The teacher gives him some articles and asks him to ...

  10. Android保存之SharedPreferences

    Android中一共有四种存储方式: SharedPreferences 为其中的一种,具体还是看代码: package com.wyl.preferencetest; import android. ...