首页 文章 精选 留言 我的

精选列表

搜索[Vue3组件库],共10000篇文章
优秀的个人博客,低调大师

Android应用程序组件Content Provider应用实例(4)

程序使用到的界面文件定义在res/layout目录下,其中,main.xml文件定义MainActivity的界面,它的内容如下所示: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="bottom"> <ListView android:id="@+id/listview_article" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/border" android:choiceMode="singleChoice"> </ListView> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="match_parent" android:gravity="center" android:layout_marginTop="10dp"> <Button android:id="@+id/button_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="15dp" android:paddingRight="15dp" android:text="@string/add"> </Button> </LinearLayout> </LinearLayout> item.xml文件定义了ListView中每一个文章信息条目的显示界面,它的内容如下所示: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textview_article_title" android:layout_width="fill_parent" android:layout_height="wrap_content"> </TextView> <TextView android:id="@+id/textview_article_abstract" android:layout_width="fill_parent" android:layout_height="wrap_content"> </TextView> <TextView android:id="@+id/textview_article_url" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp"> </TextView> </LinearLayout> article.xml文件定义了ArticleActivity的界面,它的内容如下所示: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="24dp" android:text="@string/title"> </TextView> <EditText android:id="@+id/edit_article_title" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/abs"> </TextView> <EditText android:id="@+id/edit_article_abstract" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="27dp" android:text="@string/url"> </TextView> <EditText android:id="@+id/edit_article_url" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="match_parent" android:gravity="center" android:layout_marginTop="10dp"> <Button android:id="@+id/button_modify" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/modify"> </Button> <Button android:id="@+id/button_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/delete"> </Button> <Button android:id="@+id/button_add_article" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingRight="16dp" android:text="@string/add"> </Button> <Button android:id="@+id/button_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancel"> </Button> </LinearLayout> </LinearLayout> 在res/drawable目录下,有一个border.xml文件定义了MainActivity界面上的ListView的背景,它的内容如下所示: <?xmlversion="1.0"encoding="utf-8"?> <shapexmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solidandroid:color="#ff0000ff"/> <strokeandroid:width="1dp" android:color="#000000"> </stroke> <paddingandroid:left="7dp" android:top="7dp" android:right="7dp" android:bottom="7dp"> </padding> <cornersandroid:radius="10dp"/> </shape> 程序使用到的字符串资源文件定义在res/values/strings.xml文件中,它的内容如下所示: <?xmlversion="1.0"encoding="utf-8"?> <resources> <stringname="app_name">Article</string> <stringname="article">Article</string> <stringname="add">Add</string> <stringname="modify">Modify</string> <stringname="delete">Delete</string> <stringname="title">Title:</string> <stringname="abs">Abstract:</string> <stringname="url">URL:</string> <stringname="ok">OK</string> <stringname="cancel">Cancel</string> </resources> 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966944,如需转载请自行联系原作者

优秀的个人博客,低调大师

android用户界面-组件Widget-进度条ProgressBar

android的进度条有对话框进度条、标题进度条和水平进度条 一、对话框进度条 创建步骤 1、覆盖Activity的onCreateDialog()方法,并在其中创建对话框。 2、调用Activity的showDialog()方法,显示进度条对话框。 /Chapter04_UI_ProgressBar01/src/com/amaker/test/MainActivity.java 代码 packagecom.amaker.test; importandroid.app.Activity; importandroid.app.Dialog; importandroid.app.ProgressDialog; importandroid.content.DialogInterface; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassMainActivityextendsActivity{ privateButtonmyBtn; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); myBtn=(Button)findViewById(R.id.Button01); myBtn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ showDialog(0); } }); } @Override protectedDialogonCreateDialog(intid){ ProgressDialogdialog=newProgressDialog(this); //可以不显示标题 dialog.setTitle("测试对话框"); dialog.setIndeterminate(true); dialog.setMessage("程序正在加载请稍后!"); dialog.setCancelable(true); dialog.setButton(Dialog.BUTTON_POSITIVE,"确定", newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ dialog.cancel(); } } ); returndialog; } } 二、标题栏进度条 1、调用Activity的requestWindowFeatures()方法,获得进度条。 2、调用Activity的setProgressBarIndeterminateVisibility()方法,显示进度条对话框。 /Chapter04_UI_ProgressBar02/src/com/amaker/test/MainActivity.java 代码 packagecom.amaker.test; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.Window; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassMainActivityextendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ privateButtonb1,b2; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); b1=(Button)findViewById(R.id.Button01); b2=(Button)findViewById(R.id.Button02); b1.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ setProgressBarIndeterminateVisibility(true); } }); b2.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ setProgressBarIndeterminateVisibility(false); } }); } } 三、水平进度条 创建步骤 1、在布局文件中声明ProgressBar。 2、在Activity中获得ProgressBar实例。 3、调用ProgressBar的incrementProgressBy()方法增加和减少进度。 /Chapter04_UI_ProgressBar03/src/com/amaker/test/MainActivity.java 代码 packagecom.amaker.test; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.ProgressBar; publicclassMainActivityextendsActivity{ privateButtonb1,b2; ProgressBarprogressBar; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); b1=(Button)findViewById(R.id.Button01); b2=(Button)findViewById(R.id.Button02); progressBar=(ProgressBar)findViewById(R.id.ProgressBar01); b1.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ progressBar.incrementProgressBy(1); } }); b2.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ progressBar.incrementProgressBy(-1); } }); } } /Chapter04_UI_ProgressBar03/res/layout/main.xml 代码 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ProgressBar android:id="@+id/ProgressBar01" style="?android:attr/progressBarStyleHorizontal" android:layout_width="200dip" android:layout_height="wrap_content" android:max="100" android:progress="50" ></ProgressBar> <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加"></Button> <Button android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="減少"></Button> </LinearLayout> 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1080695

优秀的个人博客,低调大师

android组件之DrawerLayout(抽屉导航)-- 侧滑菜单效果

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/41696291 一、 介绍 导航抽屉显示在屏幕的最左侧,默认情况下是隐藏的,当用户用手指从边缘向另一个滑动的时候,会出现一个隐藏的面板,当点击面板外部或者向原来的方向滑动的时候,抽屉导航就会消失了! 好了,这个抽屉就是DrawerLayout,该类位于V4包中。 android.support.v4.widget.DrawerLayout. 二、 使用 抽屉导航的实现步骤非常简单。只要配置好带有抽屉导航的布局就可以实现简单的策划菜单。布局代码如下: [html] view plain copy print? <android.support.v4.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/id_drawerlayout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/id_framelayout" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/id_btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1111"/> </FrameLayout> <LinearLayout android:id="@+id/id_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#E0EEE0" android:orientation="vertical"> <ListView android:id="@+id/id_lv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="#CD853F" android:dividerHeight="2dp"> </ListView> </LinearLayout> </android.support.v4.widget.DrawerLayout> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/id_drawerlayout" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/id_framelayout" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/id_btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1111" /> </FrameLayout> <LinearLayout android:id="@+id/id_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#E0EEE0" android:orientation="vertical" > <ListView android:id="@+id/id_lv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:divider="#CD853F" android:dividerHeight="2dp" > </ListView> </LinearLayout> </android.support.v4.widget.DrawerLayout> 说明: 1. 必须把DrawerLayout作为布局的跟标签。 2. 然后在跟标签中添加一个包含内容的视图,就是当抽屉完全隐藏的时候显示的内容布局。 3. 添加一个抽屉布局,这个布局可以按照需求自己定义,我的demo中是一个listview。 4. 抽屉布局中,需要指定 android:layout_gravity属性,官方说明是用start代替left。不过我试了一下start和left,right和end的效果是一样的。知道是什么区别?(谁知道,请留言告知一下!谢谢!) 5. 抽屉布局的宽度最好不要超过320dp,这样做为了当抽屉完全显示的时候,不至于把内容布局全部遮挡。 好了,此时在你的activity中设置一下布局文件,就可以实现一个简单的侧滑菜单了,不过菜单是在上面的。 接下来,就要初始化listview了。 [java] view plain copy print? mLv=(ListView)findViewById(R.id.id_lv); str=newString[]{"item1","item2","item3"}; ArrayAdapter<String>adapter=newArrayAdapter<String>(this, android.R.layout.simple_list_item_1,str); mLv.setAdapter(adapter); mLv.setOnItemClickListener(this); mLv = (ListView) findViewById(R.id.id_lv); str = new String[] { "item1", "item2", "item3"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, str); mLv.setAdapter(adapter); mLv.setOnItemClickListener(this); 下面,设置抽屉导航的监听事件。添加监听器的时候有三种方式。 1. 设置DrawerLayout.DrawerListener作为监听器类,里面包含四个回调函数。 代码如下: [java] view plain copy print? mDrawerLayout.setDrawerListener(newDrawerListener(){ /** *当抽屉滑动状态改变的时候被调用 *状态值是STATE_IDLE(闲置--0),STATE_DRAGGING(拖拽的--1),STATE_SETTLING(固定--2)中之一。 *抽屉打开的时候,点击抽屉,drawer的状态就会变成STATE_DRAGGING,然后变成STATE_IDLE */ @Override publicvoidonDrawerStateChanged(intarg0){ Log.i("drawer","drawer的状态:"+arg0); } /** *当抽屉被滑动的时候调用此方法 *arg1表示滑动的幅度(0-1) */ @Override publicvoidonDrawerSlide(Viewarg0,floatarg1){ Log.i("drawer",arg1+""); } /** *当一个抽屉被完全打开的时候被调用 */ @Override publicvoidonDrawerOpened(Viewarg0){ Log.i("drawer","抽屉被完全打开了!"); } /** *当一个抽屉完全关闭的时候调用此方法 */ @Override publicvoidonDrawerClosed(Viewarg0){ Log.i("drawer","抽屉被完全关闭了!"); } }); mDrawerLayout.setDrawerListener(new DrawerListener() { /** * 当抽屉滑动状态改变的时候被调用 * 状态值是STATE_IDLE(闲置--0), STATE_DRAGGING(拖拽的--1), STATE_SETTLING(固定--2)中之一。 * 抽屉打开的时候,点击抽屉,drawer的状态就会变成STATE_DRAGGING,然后变成STATE_IDLE */ @Override public void onDrawerStateChanged(int arg0) { Log.i("drawer", "drawer的状态:" + arg0); } /** * 当抽屉被滑动的时候调用此方法 * arg1 表示 滑动的幅度(0-1) */ @Override public void onDrawerSlide(View arg0, float arg1) { Log.i("drawer", arg1 + ""); } /** * 当一个抽屉被完全打开的时候被调用 */ @Override public void onDrawerOpened(View arg0) { Log.i("drawer", "抽屉被完全打开了!"); } /** * 当一个抽屉完全关闭的时候调用此方法 */ @Override public void onDrawerClosed(View arg0) { Log.i("drawer", "抽屉被完全关闭了!"); } }); 2. 设置DrawerListener的子类SimpleDrawerListener,使用这个类的时候不必实现全部的回调函数,可以根据自己的需要重写相应的方法。 代码如下: [java] view plain copy print? mDrawerLayout.setDrawerListener(newDrawerLayout.SimpleDrawerListener(){ @Override publicvoidonDrawerClosed(ViewdrawerView){ super.onDrawerClosed(drawerView); } @Override publicvoidonDrawerOpened(ViewdrawerView){ super.onDrawerOpened(drawerView); } }); mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); } }); 3. 使用DrawerListener的子类ActionBarDrawerToggle。一般与ActionBar结合使用。 代码如下: [java] view plain copy print? mDrawerToggle=newActionBarDrawerToggle(this,mDrawerLayout, R.drawable.ic_drawer,R.string.drawer_open, R.string.drawer_close){ @Override publicvoidonDrawerClosed(ViewdrawerView){ getActionBar().setTitle(mTitle); invalidateOptionsMenu(); } @Override publicvoidonDrawerOpened(ViewdrawerView){ getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { @Override public void onDrawerClosed(View drawerView) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); } @Override public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); 调用closeDrawer()和openDrawer()可以关闭和打开抽屉。其他的方法就参考API吧! 三、 总结 抽屉导航就介绍到此,总的来说drawer使用起来非常的简单。不过有一点不好的是,它是把抽屉显示在内容的上面,而不是下面。我觉得大多数的侧滑菜单一般都是在下面的。我在api中也没有找到关于设置抽屉上下关系的函数。 如果想要菜单在下面的方法,就用github上面的 slidingmenu吧! 四、 下载 demo点此下载!欢迎指教!如有问题,请留言! 本文转自 一点点征服 博客园博客,原文链接: http://www.cnblogs.com/ldq2016/p/5369087.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android应用程序组件Content Provider应用实例(3)

下面是ArticlesAdapter类的实现,它实现在src/shy/luo/ArticlesAdapter.java文件中: packageshy.luo.article; importjava.util.LinkedList; importshy.luo.providers.articles.Articles; importandroid.content.ContentResolver; importandroid.content.ContentUris; importandroid.content.ContentValues; importandroid.content.Context; importandroid.content.IContentProvider; importandroid.database.Cursor; importandroid.net.Uri; importandroid.os.Bundle; importandroid.os.RemoteException; importandroid.util.Log; publicclassArticlesAdapter{ privatestaticfinalStringLOG_TAG="shy.luo.article.ArticlesAdapter"; privateContentResolverresolver=null; publicArticlesAdapter(Contextcontext){ resolver=context.getContentResolver(); } publiclonginsertArticle(Articlearticle){ ContentValuesvalues=newContentValues(); values.put(Articles.TITLE,article.getTitle()); values.put(Articles.ABSTRACT,article.getAbstract()); values.put(Articles.URL,article.getUrl()); Uriuri=resolver.insert(Articles.CONTENT_URI,values); StringitemId=uri.getPathSegments().get(1); returnInteger.valueOf(itemId).longValue(); } publicbooleanupdateArticle(Articlearticle){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_URI,article.getId()); ContentValuesvalues=newContentValues(); values.put(Articles.TITLE,article.getTitle()); values.put(Articles.ABSTRACT,article.getAbstract()); values.put(Articles.URL,article.getUrl()); intcount=resolver.update(uri,values,null,null); returncount>0; } publicbooleanremoveArticle(intid){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_URI,id); intcount=resolver.delete(uri,null,null); returncount>0; } publicLinkedList<Article>getAllArticles(){ LinkedList<Article>articles=newLinkedList<Article>(); String[]projection=newString[]{ Articles.ID, Articles.TITLE, Articles.ABSTRACT, Articles.URL }; Cursorcursor=resolver.query(Articles.CONTENT_URI,projection,null,null,Articles.DEFAULT_SORT_ORDER); if(cursor.moveToFirst()){ do{ intid=cursor.getInt(0); Stringtitle=cursor.getString(1); Stringabs=cursor.getString(2); Stringurl=cursor.getString(3); Articlearticle=newArticle(id,title,abs,url); articles.add(article); }while(cursor.moveToNext()); } returnarticles; } publicintgetArticleCount(){ intcount=0; try{ IContentProviderprovider=resolver.acquireProvider(Articles.CONTENT_URI); Bundlebundle=provider.call(Articles.METHOD_GET_ITEM_COUNT,null,null); count=bundle.getInt(Articles.KEY_ITEM_COUNT,0); }catch(RemoteExceptione){ e.printStackTrace(); } returncount; } publicArticlegetArticleById(intid){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_URI,id); String[]projection=newString[]{ Articles.ID, Articles.TITLE, Articles.ABSTRACT, Articles.URL }; Cursorcursor=resolver.query(uri,projection,null,null,Articles.DEFAULT_SORT_ORDER); Log.i(LOG_TAG,"cursor.moveToFirst"); if(!cursor.moveToFirst()){ returnnull; } Stringtitle=cursor.getString(1); Stringabs=cursor.getString(2); Stringurl=cursor.getString(3); returnnewArticle(id,title,abs,url); } publicArticlegetArticleByPos(intpos){ Uriuri=ContentUris.withAppendedId(Articles.CONTENT_POS_URI,pos); String[]projection=newString[]{ Articles.ID, Articles.TITLE, Articles.ABSTRACT, Articles.URL }; Cursorcursor=resolver.query(uri,projection,null,null,Articles.DEFAULT_SORT_ORDER); if(!cursor.moveToFirst()){ returnnull; } intid=cursor.getInt(0); Stringtitle=cursor.getString(1); Stringabs=cursor.getString(2); Stringurl=cursor.getString(3); returnnewArticle(id,title,abs,url); } } 这个类首先在构造函数里面获得应用程序上下文的ContentResolver接口,然后通过就可以通过这个接口来访问ArticlesProvider中的文章信息了。成员函数insertArticle、updateArticle和removeArticle分别用来新增、更新和删除一个文章信息条目;成员函数getAllArticlese用来获取所有的文章信息;成员函数getArticleById和getArticleByPos分别根据文章的ID和位置来获得具体文章信息条目;成员函数getArticleCount直接使用ContentProvider的未公开接口call来获得文章信息条目的数量,注意,这个函数要源代码环境下编译才能通过。 下面是程序主界面MainActivity类的实现,它实现在src/shy/luo/article/MainActivity.java文件中: packageshy.luo.article; importshy.luo.providers.articles.Articles; importandroid.app.Activity; importandroid.content.Context; importandroid.content.Intent; importandroid.database.ContentObserver; importandroid.os.Bundle; importandroid.os.Handler; importandroid.util.Log; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.AdapterView; importandroid.widget.BaseAdapter; importandroid.widget.Button; importandroid.widget.ListView; importandroid.widget.TextView; publicclassMainActivityextendsActivityimplementsView.OnClickListener,AdapterView.OnItemClickListener{ privatefinalstaticStringLOG_TAG="shy.luo.article.MainActivity"; privatefinalstaticintADD_ARTICAL_ACTIVITY=1; privatefinalstaticintEDIT_ARTICAL_ACTIVITY=2; privateArticlesAdapteraa=null; privateArticleAdapteradapter=null; privateArticleObserverobserver=null; privateListViewarticleList=null; privateButtonaddButton=null; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); aa=newArticlesAdapter(this); articleList=(ListView)findViewById(R.id.listview_article); adapter=newArticleAdapter(this); articleList.setAdapter(adapter); articleList.setOnItemClickListener(this); observer=newArticleObserver(newHandler()); getContentResolver().registerContentObserver(Articles.CONTENT_URI,true,observer); addButton=(Button)findViewById(R.id.button_add); addButton.setOnClickListener(this); Log.i(LOG_TAG,"MainActivityCreated"); } @Override publicvoidonDestroy(){ super.onDestroy(); getContentResolver().unregisterContentObserver(observer); } @Override publicvoidonClick(Viewv){ if(v.equals(addButton)){ Intentintent=newIntent(this,ArticleActivity.class); startActivityForResult(intent,ADD_ARTICAL_ACTIVITY); } } @Override publicvoidonItemClick(AdapterView<?>parent,Viewview,intpos,longid){ Intentintent=newIntent(this,ArticleActivity.class); Articlearticle=aa.getArticleByPos(pos); intent.putExtra(Articles.ID,article.getId()); intent.putExtra(Articles.TITLE,article.getTitle()); intent.putExtra(Articles.ABSTRACT,article.getAbstract()); intent.putExtra(Articles.URL,article.getUrl()); startActivityForResult(intent,EDIT_ARTICAL_ACTIVITY); } @Override publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ super.onActivityResult(requestCode,resultCode,data); switch(requestCode){ caseADD_ARTICAL_ACTIVITY:{ if(resultCode==Activity.RESULT_OK){ Stringtitle=data.getStringExtra(Articles.TITLE); Stringabs=data.getStringExtra(Articles.ABSTRACT); Stringurl=data.getStringExtra(Articles.URL); Articlearticle=newArticle(-1,title,abs,url); aa.insertArticle(article); } break; } caseEDIT_ARTICAL_ACTIVITY:{ if(resultCode==Activity.RESULT_OK){ intaction=data.getIntExtra(ArticleActivity.EDIT_ARTICLE_ACTION,-1); if(action==ArticleActivity.MODIFY_ARTICLE){ intid=data.getIntExtra(Articles.ID,-1); Stringtitle=data.getStringExtra(Articles.TITLE); Stringabs=data.getStringExtra(Articles.ABSTRACT); Stringurl=data.getStringExtra(Articles.URL); Articlearticle=newArticle(id,title,abs,url); aa.updateArticle(article); }elseif(action==ArticleActivity.DELETE_ARTICLE){ intid=data.getIntExtra(Articles.ID,-1); aa.removeArticle(id); } } break; } } } privateclassArticleObserverextendsContentObserver{ publicArticleObserver(Handlerhandler){ super(handler); } @Override publicvoidonChange(booleanselfChange){ adapter.notifyDataSetChanged(); } } privateclassArticleAdapterextendsBaseAdapter{ privateLayoutInflaterinflater; publicArticleAdapter(Contextcontext){ inflater=LayoutInflater.from(context); } @Override publicintgetCount(){ returnaa.getArticleCount(); } @Override publicObjectgetItem(intpos){ returnaa.getArticleByPos(pos); } @Override publiclonggetItemId(intpos){ returnaa.getArticleByPos(pos).getId(); } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ Articlearticle=(Article)getItem(position); if(convertView==null){ convertView=inflater.inflate(R.layout.item,null); } TextViewtitleView=(TextView)convertView.findViewById(R.id.textview_article_title); titleView.setText("Title:"+article.getTitle()); TextViewabstractView=(TextView)convertView.findViewById(R.id.textview_article_abstract); abstractView.setText("Abstract:"+article.getAbstract()); TextViewurlView=(TextView)convertView.findViewById(R.id.textview_article_url); urlView.setText("URL:"+article.getUrl()); returnconvertView; } } } 在应用程序的主界面中,我们使用一个ListView来显示文章信息条目,这个ListView的数据源由ArticleAdapter类来提供,而ArticleAdapter类又是通过ArticlesAdapter类来获得ArticlesProvider中的文章信息的。在MainActivity的onCreate函数,我们还通过应用程序上下文的ContentResolver接口来注册了一个ArticleObserver对象来监控ArticlesProvider中的文章信息。一旦ArticlesProvider中的文章信息发生变化,就会通过ArticleAdapter类来实时更新ListView中的文章信息。 下面是ArticleActivity类的实现,它实现在src/shy/luo/article/ArticleActivity.java文件中: packageshy.luo.article; importshy.luo.providers.articles.Articles; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.util.Log; importandroid.view.View; importandroid.widget.Button; importandroid.widget.EditText; publicclassArticleActivityextendsActivityimplementsView.OnClickListener{ privatefinalstaticStringLOG_TAG="shy.luo.article.ArticleActivity"; publicfinalstaticStringEDIT_ARTICLE_ACTION="EDIT_ARTICLE_ACTION"; publicfinalstaticintMODIFY_ARTICLE=1; publicfinalstaticintDELETE_ARTICLE=2; privateintarticleId=-1; privateEditTexttitleEdit=null; privateEditTextabstractEdit=null; privateEditTexturlEdit=null; privateButtonaddButton=null; privateButtonmodifyButton=null; privateButtondeleteButton=null; privateButtoncancelButton=null; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.article); titleEdit=(EditText)findViewById(R.id.edit_article_title); abstractEdit=(EditText)findViewById(R.id.edit_article_abstract); urlEdit=(EditText)findViewById(R.id.edit_article_url); addButton=(Button)findViewById(R.id.button_add_article); addButton.setOnClickListener(this); modifyButton=(Button)findViewById(R.id.button_modify); modifyButton.setOnClickListener(this); deleteButton=(Button)findViewById(R.id.button_delete); deleteButton.setOnClickListener(this); cancelButton=(Button)findViewById(R.id.button_cancel); cancelButton.setOnClickListener(this); Intentintent=getIntent(); articleId=intent.getIntExtra(Articles.ID,-1); if(articleId!=-1){ Stringtitle=intent.getStringExtra(Articles.TITLE); titleEdit.setText(title); Stringabs=intent.getStringExtra(Articles.ABSTRACT); abstractEdit.setText(abs); Stringurl=intent.getStringExtra(Articles.URL); urlEdit.setText(url); addButton.setVisibility(View.GONE); }else{ modifyButton.setVisibility(View.GONE); deleteButton.setVisibility(View.GONE); } Log.i(LOG_TAG,"ArticleActivityCreated"); } @Override publicvoidonClick(Viewv){ if(v.equals(addButton)){ Stringtitle=titleEdit.getText().toString(); Stringabs=abstractEdit.getText().toString(); Stringurl=urlEdit.getText().toString(); Intentresult=newIntent(); result.putExtra(Articles.TITLE,title); result.putExtra(Articles.ABSTRACT,abs); result.putExtra(Articles.URL,url); setResult(Activity.RESULT_OK,result); finish(); }elseif(v.equals(modifyButton)){ Stringtitle=titleEdit.getText().toString(); Stringabs=abstractEdit.getText().toString(); Stringurl=urlEdit.getText().toString(); Intentresult=newIntent(); result.putExtra(Articles.ID,articleId); result.putExtra(Articles.TITLE,title); result.putExtra(Articles.ABSTRACT,abs); result.putExtra(Articles.URL,url); result.putExtra(EDIT_ARTICLE_ACTION,MODIFY_ARTICLE); setResult(Activity.RESULT_OK,result); finish(); }elseif(v.equals(deleteButton)){ Intentresult=newIntent(); result.putExtra(Articles.ID,articleId); result.putExtra(EDIT_ARTICLE_ACTION,DELETE_ARTICLE); setResult(Activity.RESULT_OK,result); finish(); }elseif(v.equals(cancelButton)){ setResult(Activity.RESULT_CANCELED,null); finish(); } } } 在ArticleActivity窗口中,我们可以执行新增、更新和删除文章信息的操作。如果启动ArticleActivity时,没有把文章ID传进来,就说明要执行操作是新增文章信息;如果启动ArticleActivity时,把文章ID和其它信自都传进来了,就说明要执行的操作是更新或者删除文章,根据用户在界面点击的是更新按钮还是删除按钮来确定。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966942,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册