ch023 Android(安卓)ContentProvider(第二部分)
--------------------------------------------AndroidManifest.xml----------------------------------
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.kawa.ch23"
android:versionCode="1"
android:versionName="1.0">
<uses-sdkandroid:minSdkVersion="8"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<uses-libraryandroid:name="android.test.runner"/>
<activity
android:label="@string/app_name"
android:name=".MainActivity">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<provider
android:authorities="com.kawa.ch23.provider.myprovider"
android:name=".provider.MyProvider">
</provider>
<activityandroid:name="com.kawa.ch23.ItemActivity"></activity>
</application>
<instrumentationandroid:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.kawa.ch23"android:label="TestsforMyApp"/>
</manifest>
--------------------------------------------Layoutactivity_main.java----------------------------
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"/>
<EditText
android:id="@+id/edtname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fy"/>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄"/>
<EditText
android:id="@+id/edtage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="21"/>
</TableRow>
</TableLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btnadd"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="新增"/>
<Button
android:id="@+id/btnqueryall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="查询所有"/>
</LinearLayout>
<ListView
android:id="@+id/lvall"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
--------------------------------------------Layoutitem.xml--------------------------------------
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ID"/>
<EditText
android:id="@+id/edt_item_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"/>
<EditText
android:id="@+id/edt_item_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄"/>
<EditText
android:id="@+id/edt_item_age"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</TableRow>
</TableLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btndel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="删除"/>
<Button
android:id="@+id/btnupdate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="更新"/>
</LinearLayout>
</LinearLayout>
--------------------------------------------Layoutlist_item.xml----------------------------------
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tvId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:id="@+id/tvname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView
android:id="@+id/tvage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
--------------------------------------------MainActivity.java--------------------------------------
packagecom.kawa.ch23;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importcom.kawa.ch23.model.Person;
importcom.kawa.ch23.util.Const;
importandroid.app.Activity;
importandroid.content.ContentResolver;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.database.Cursor;
importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.AdapterView;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.ListView;
importandroid.widget.SimpleAdapter;
importandroid.widget.Toast;
/**
*
*项目名称:com.kawa.ch23
*类名称:MainActivity
*类描述:
*创建人:方勇
*创建时间:2012-12-14下午9:38:39
*Copyright(c)方勇-版权所有
*/
publicclassMainActivityextendsActivity{
privateButtonbtn_add,btn_queryall;
privateEditTextfield_name,field_age;
privateListViewlistview;
privateList<Person>persons;
privateSimpleAdaptersimpleAdapter;
privateHandlerhandler=newHandler(){//异步消息
@Override
publicvoidhandleMessage(Messagemsg){
List<Map<String,Object>>data=(List<Map<String,Object>>)msg.obj;
System.out.println(data.size());
simpleAdapter=newSimpleAdapter(MainActivity.this,data,
R.layout.list_item,newString[]{"id","name","age"},newint[]{
R.id.tvId,R.id.tvname,R.id.tvage});
listview.setAdapter(simpleAdapter);
}
};
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
persons=newArrayList<Person>();
findViews();
setListeners();
}
privatevoidfindViews(){
btn_queryall=(Button)this.findViewById(R.id.btnqueryall);
btn_add=(Button)this.findViewById(R.id.btnadd);
field_name=(EditText)this.findViewById(R.id.edtname);
field_age=(EditText)this.findViewById(R.id.edtage);
listview=(ListView)this.findViewById(R.id.lvall);
}
privatevoidsetListeners(){
btn_add.setOnClickListener(addOnClickListener);
//查询所有
btn_queryall.setOnClickListener(queryOnClickListener);
listview.setOnItemClickListener(onItemClickListener);
}
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
if(resultCode==2){
MyThreadthread=newMyThread(MainActivity.this);
thread.start();
}
}
privateOnClickListeneraddOnClickListener=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
ContentResolvercontentResolver=MainActivity.this
.getContentResolver();
Uriurl=Uri.parse("content://"+Const.PROVIDER_URL+"/person");
ContentValuesvalues=newContentValues();
values.put("name",field_name.getText().toString());
values.put("age",field_age.getText().toString());
Uriresult=contentResolver.insert(url,values);
System.out.println(result.toString());
if(ContentUris.parseId(result)>0){
Toast.makeText(MainActivity.this,"添加成功",
Toast.LENGTH_LONG).show();
//添加成功后再启动线程查询
MyThreadthread=newMyThread(MainActivity.this);
thread.start();
}
}
};
privateOnClickListenerqueryOnClickListener=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
MyThreadthread=newMyThread(MainActivity.this);
thread.start();
}
};
privateOnItemClickListeneronItemClickListener=newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,
longid){
System.out.println("position:"+position);
Personperson=persons.get(position);
Bundlebundle=newBundle();
bundle.putInt("id",person.getId());
bundle.putString("name",person.getName());
bundle.putInt("age",person.getAge());
Intentintent=newIntent(MainActivity.this,
ItemActivity.class);
intent.putExtra("item",bundle);
startActivityForResult(intent,1);
}
};
classMyThreadextendsThread{
Contextcontext;
publicMyThread(Contextcontext){
//一定要清空。否则会有问题,每执行一次都会把之前的全部的item加进去
persons.clear();
listview.setAdapter(null);
this.context=context;
}
@Override
publicvoidrun(){
Uriurl=Uri.parse("content://"+Const.PROVIDER_URL+"/person");
Cursorcursor=context.getContentResolver().query(url,
newString[]{"_id","name","age"},null,null,"_id");
while(cursor.moveToNext()){
Personperson=newPerson();
person.setId(cursor.getInt(cursor.getColumnIndex("_id")));
person.setName(cursor.getString(cursor.getColumnIndex("name")));
person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
persons.add(person);
}
cursor.close();
List<Map<String,Object>>data=newArrayList<Map<String,Object>>();
Map<String,Object>map=null;
for(inti=0;i<persons.size();i++){
map=newHashMap<String,Object>();
map.put("id",persons.get(i).getId());
map.put("name",persons.get(i).getName());
map.put("age",persons.get(i).getAge());
data.add(map);
}
Messagemsg=handler.obtainMessage();
msg.obj=data;
handler.sendMessage(msg);
}
}
}
--------------------------------------------ItemActivity.java--------------------------------------
packagecom.kawa.ch23;
importcom.kawa.ch23.util.Const;
importandroid.app.Activity;
importandroid.content.ContentResolver;
importandroid.content.ContentValues;
importandroid.content.Intent;
importandroid.net.Uri;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
/**
*
*项目名称:com.kawa.ch23
*类名称:ItemActivity
*类描述:
*创建人:方勇
*创建时间:2012-12-14下午9:45:04
*Copyright(c)方勇-版权所有
*/
publicclassItemActivityextendsActivity{
privateEditTextfield_name;
privateEditTextfield_age;
privateEditTextfield_id;
privateButtonbtn_del,btn_update;
//传数据
privateIntentintent;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.item);
findViews();
setListeners();
intent=getIntent();
Bundlebundle=intent.getBundleExtra("item");//选中的数据
intid=bundle.getInt("id");
Stringname=bundle.getString("name");
intage=bundle.getInt("age");
field_id.setText(String.valueOf(id));
field_name.setText(name);
field_age.setText(String.valueOf(age));
}
privatevoidfindViews(){
field_id=(EditText)this.findViewById(R.id.edt_item_id);
field_id.setEnabled(false);//控制不可用
field_name=(EditText)this.findViewById(R.id.edt_item_name);
field_age=(EditText)this.findViewById(R.id.edt_item_age);
//得到传过来的数据
btn_del=(Button)this.findViewById(R.id.btndel);
btn_update=(Button)this.findViewById(R.id.btnupdate);
}
privatevoidsetListeners(){
btn_del.setOnClickListener(delOnClickListener);
btn_update.setOnClickListener(updateOnClickListener);
}
privateOnClickListenerupdateOnClickListener=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
ContentResolvercontentResolver=ItemActivity.this.getContentResolver();
//构建Uri
Stringurl="content://"+Const.PROVIDER_URL+"/person/"
+field_id.getText();
Uriuri=Uri.parse(url);
ContentValuesvalues=newContentValues();
values.put("name",field_name.getText().toString());
values.put("age",Integer.parseInt(field_age.getText().toString()));
intresult=contentResolver.update(uri,values,null,null);
System.out.println("updateresult:"+result);
if(result>=1){
Toast.makeText(ItemActivity.this,"更新成功",Toast.LENGTH_LONG).show();
ItemActivity.this.setResult(2);//设置返回结果
ItemActivity.this.finish();//销毁
}
}
};
privateOnClickListenerdelOnClickListener=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
ContentResolvercontentResolver=ItemActivity.this.getContentResolver();
//构建Uri
Stringurl="content://"+Const.PROVIDER_URL+"/person/"
+field_id.getText();
Uriuri=Uri.parse(url);
intresult=contentResolver.delete(uri,null,null);
System.out.println("deleteresult:"+result);
if(result>=1){
Toast.makeText(ItemActivity.this,"删除成功",Toast.LENGTH_LONG).show();
ItemActivity.this.setResult(2);
ItemActivity.this.finish();//销毁
}
}
};
}
--------------------------------------------util目录Const.java-----------------------------------
publicclassConst{
publicstaticStringPROVIDER_URL="com.kawa.ch23.provider.myprovider";
}
--------------------------------------------provider目录MyProvider.java-----------------------
packagecom.kawa.ch23.provider;
importandroid.content.ContentProvider;
importandroid.content.ContentUris;
importandroid.content.ContentValues;
importandroid.content.UriMatcher;
importandroid.database.Cursor;
importandroid.net.Uri;
importcom.kawa.ch23.db.DBHelper;
importcom.kawa.ch23.util.Const;
/**
*
*项目名称:com.kawa.ch23
*类名称:MyProvider
*类描述:提供者
*创建人:方勇
*创建时间:2012-12-14下午9:49:38
*Copyright(c)方勇-版权所有
*/
publicclassMyProviderextendsContentProvider{
privateDBHelperdbHelper;
//定义一个UriMatcher类
privatestaticfinalUriMatcherMATCHER=newUriMatcher(
UriMatcher.NO_MATCH);
privatestaticfinalintPERSONS=1;
privatestaticfinalintPERSON=2;
static{
MATCHER.addURI(Const.PROVIDER_URL,"person",PERSONS);
MATCHER.addURI(Const.PROVIDER_URL,"person/#",PERSON);
}
@Override
publicbooleanonCreate(){
System.out.println("---oncreate----");
dbHelper=newDBHelper(this.getContext());
dbHelper.open();
returnfalse;
}
//查询数据
@Override
publicCursorquery(Uriuri,String[]projection,Stringselection,
String[]selectionArgs,StringsortOrder){
switch(MATCHER.match(uri)){
casePERSONS:
//查询所有的数据
returndbHelper.findList("person",projection,selection,selectionArgs,
null,null,sortOrder);
casePERSON:
//查询某个ID的数据
//通过ContentUris这个工具类解释出ID
longid=ContentUris.parseId(uri);
Stringwhere="_id="+id;
if(!"".equals(selection)&&selection!=null){
where=selection+"and"+where;
}
returndbHelper.findList("person",projection,where,selectionArgs,null,
null,sortOrder);
default:
thrownewIllegalArgumentException("unknowuri"+uri.toString());
}
}
//返回当前操作的数据的mimeType
@Override
publicStringgetType(Uriuri){
switch(MATCHER.match(uri)){
casePERSONS:
return"vnd.android.cursor.dir/person";
casePERSON:
return"vnd.android.cursor.item/person";
default:
thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
}
}
//插入数据
@Override
publicUriinsert(Uriuri,ContentValuesvalues){
UriinsertUri=null;
switch(MATCHER.match(uri)){
casePERSONS:
longrowid=dbHelper.insert("person",values);
insertUri=ContentUris.withAppendedId(uri,rowid);
break;
default:
thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
}
returninsertUri;
}
//删除数据
@Override
publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
intcount=0;
switch(MATCHER.match(uri)){
casePERSONS:
count=dbHelper.delete("person",selection,selectionArgs);
returncount;
casePERSON:
longid=ContentUris.parseId(uri);
Stringwhere="_id="+id;
if(selection!=null&&!"".equals(selection)){
where=selection+"and"+where;
}
count=dbHelper.delete("person",where,selectionArgs);
returncount;
default:
thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
}
}
//更新数据
@Override
publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
String[]selectionArgs){
intcount=0;
switch(MATCHER.match(uri)){
casePERSONS:
count=dbHelper.update("person",values,selection,selectionArgs);
break;
casePERSON:
//通过ContentUri工具类得到ID
longid=ContentUris.parseId(uri);
Stringwhere="_id="+id;
if(selection!=null&&!"".equals(selection)){
where=selection+"and"+where;
}
count=dbHelper.update("person",values,where,selectionArgs);
break;
default:
thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
}
returncount;
}
}
--------------------------------------------provider目录Test.java-------------------------------
packagecom.kawa.ch23.provider;
importcom.kawa.ch23.util.Const;
importandroid.content.ContentResolver;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.net.Uri;
importandroid.test.AndroidTestCase;
publicclassTestextendsAndroidTestCase{
/*保存*/
publicvoidtestInsert()throwsException{
ContentResolvercontentResolver=this.getContext()
.getContentResolver();
Uriurl=Uri.parse("content://"+Const.PROVIDER_URL+"/person");
ContentValuesvalues=newContentValues();
values.put("name","jiahui2");
values.put("age",20);
contentResolver.insert(url,values);
}
/*删除*/
publicvoidtestDelete()throwsException{
ContentResolvercontentResolver=this.getContext()
.getContentResolver();
Uriurl=Uri.parse("content://"+Const.PROVIDER_URL+"/person/1");
//ContentValuesvalues=newContentValues();
contentResolver.delete(url,null,null);
}
/*更新*/
publicvoidtestUpdate()throwsException{
ContentResolvercontentResolver=this.getContext()
.getContentResolver();
Uriurl=Uri.parse("content://"+Const.PROVIDER_URL+"/person/1");
ContentValuesvalues=newContentValues();
values.put("name","jiahui2");
values.put("age",20);
contentResolver.update(url,values,null,null);
}
/*查询*/
publicvoidtestQuery()throwsException{
ContentResolvercontentResolver=this.getContext()
.getContentResolver();
Uriurl=Uri.parse("content://"+Const.PROVIDER_URL+"/person");
Cursorcursor=contentResolver.query(url,newString[]{"_id",
"name","age"},null,null,"_id");
while(cursor.moveToNext()){
System.out.println("_id:"+cursor.getInt(cursor.getColumnIndex("_id")));
System.out.println("name:"+cursor.getString(cursor.getColumnIndex("name")));
System.out.println("age:"+cursor.getInt(cursor.getColumnIndex("age")));
}
}
}
--------------------------------------------model目录Person.java-------------------------------
packagecom.kawa.ch23.model;
importjava.io.Serializable;
publicclassPersonimplementsSerializable{
privateintid;
privateStringname;
privateintage;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
@Override
publicinthashCode(){
finalintprime=31;
intresult=1;
result=prime*result+age;
result=prime*result+id;
result=prime*result+((name==null)?0:name.hashCode());
returnresult;
}
@Override
publicbooleanequals(Objectobj){
if(this==obj)
returntrue;
if(obj==null)
returnfalse;
if(getClass()!=obj.getClass())
returnfalse;
Personother=(Person)obj;
if(age!=other.age)
returnfalse;
if(id!=other.id)
returnfalse;
if(name==null){
if(other.name!=null)
returnfalse;
}elseif(!name.equals(other.name))
returnfalse;
returntrue;
}
@Override
publicStringtoString(){
return"Person[id="+id+",name="+name+",age="+age+"]";
}
}
--------------------------------------------db目录DBHelper.java--------------------------------
packagecom.kawa.ch23.db;
importcom.kawa.ch23.util.LogOut;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.database.SQLException;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
/**
*
*项目名称:com.kawa.ch21
*
*类名称:DBHelper
*
*类描述:Sqlite3数据库操作工具类
*
*创建人:fy
*
*创建时间:2012-9-7上午9:27:24
*
*Copyright(c)方勇-版权所有
*/
publicclassDBHelper{
//DDL操作
privatestaticDatabaseHelperdbHelper;
//DML操作
privatestaticSQLiteDatabasedb;
//数据库名
privatestaticfinalStringDATABASE_NAME="kawa.db";
//数据库版本
privatestaticfinalintDATABASE_VERSION=1;
//上下文环境
privatefinalContextmCtx;
/*SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理*/
privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{
DatabaseHelper(Contextcontext){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Override
publicvoidonCreate(SQLiteDatabasedb){
Stringsql="createtableIFNOTEXISTSperson(_idintegerprimarykeyautoincrement,nametext,ageinteger)";
LogOut.out("fy","sql["+sql+"]");
db.execSQL(sql);
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
System.out.println("upgradeadatabase");
}
}
publicDBHelper(Contextctx){
this.mCtx=ctx;
}
publicDBHelperopen()throwsSQLException{
dbHelper=newDatabaseHelper(mCtx);
db=dbHelper.getWritableDatabase();
returnthis;
}
publicvoidcloseclose(){
db.close();
dbHelper.close();
}
/**
*插入数据
*参数:tableName表名
*initialValues要插入的列对应值
**/
publiclonginsert(StringtableName,ContentValuesinitialValues){
returndb.insert(tableName,null,initialValues);
}
/**
*删除数据
*参数:tableName表名
*deleteCondition删除的条件
*deleteArgs如果deleteCondition中有“?”号,将用此数组中的值替换
**/
publicintdelete(StringtableName,StringdeleteCondition,
String[]deleteArgs){
returndb.delete(tableName,deleteCondition,deleteArgs);
}
/**
*更新数据
*参数:tableName表名
*initialValues要更新的列
*selection更新的条件
*selectArgs如果selection中有“?”号,将用此数组中的值替换
**/
publicintupdate(StringtableName,ContentValuesinitialValues,
Stringselection,String[]selectArgs){
intreturnValue=db
.update(tableName,initialValues,selection,selectArgs);
returnreturnValue;
}
/**
*取得一个列表
*参数:tableName表名
*columns返回的列
*selection查询条件
*selectArgs如果selection中有“?”号,将用此数组中的值替换
**/
publicCursorfindList(StringtableName,String[]columns,Stringselection,
String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy){
returndb.query(tableName,columns,selection,selectionArgs,groupBy,
having,orderBy);
}
}
--------------------------------------------结果----------------------------------------------------
<!--EndFragment-->
更多相关文章
- ch028 Android(安卓)断点续传
- ch016 Android(安卓)自定义对话框.
- ch031 Android(安卓)AsyncTask
- Android(安卓)数据库技术
- Android:GridView+AbsoluteLayout作一个四宫格
- Android(安卓)- 自定义SeekBar
- android studio 在线更新android sdk,遇到无法Fetching https://d
- android 中文粗体
- 黑马程序员之手机卫士第八天