实时文件夹是一种用来显示由某个ContentProvider提供的数据信息的桌面组件。要创建一个实时文件夹,必须要有两方面的支持。一方面是,要定义一个用来创建实时文件夹的Activity。另一方面是,所指定数据信息URI的ContentProvider必须支持实时文件夹的查询。
本人对于实现最基本的通讯录打电话简单操作俩种方法,并且我都进行了尝试,不过对于其中一种方法实现实在过于复杂,因为牵扯到众多不同种Cursor的应用,在这里本人得到了一个较为简单的方法实现想要的效果,还是先将图片能上来看其效果吧!
点击之后
这是我通讯录里出现的人的设置,随机点击一个
得到我们最终想要的结果!
下面我们来看一下具体的操作设置:
首先是编辑AndroidManifest.xml文件
xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zzy.folder"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".LivefoldersActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.CREATE_LIVE_FOLDER" />
<category android:name="android.intent.category.DEFAULT" />
intent-filter>
activity>
application>
manifest>
下面是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" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
LinearLayout>
要说明的是android.intent.extra.livefolder.BASE_INTENT这一附加信息,它的值是一个Intent对象。在用户单击展开实时文件夹后的选项时,首先该Intent对象的Data中的URI会附加上所点选项的ID,然后传入Launcher调用的startActivity方法中以启动所期望的Activity。这里我们把BASE_INTENT设置成了Actionandroid.intent.action.View、URI为content://contacts/people/的Intent对象。具体操作下面显示:
下面需要onCreate方法中将实现文件夹的相关信息装入Intent,并通过setResult方法设置为Intent,最后调用finish方法结束,并把结果返回给Home应用程序,以添加实施文件夹:
public class LivefoldersActivity extends Activity {
public static final Uri LIVE_FOLDER_URI = Uri
.parse("content://contacts/live_folders/people");
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*if (getIntent().getAction().equals(
* 我认为这里无需判断,既然已经在AndroidMainfest.xml文件里配置了,如若能打开这个Activity,
* 证明这个判断就通过,这里就多此一举。
LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {*/
Intent intent = new Intent();
intent.setData(LIVE_FOLDER_URI);
//设置文件夹的名字
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME,"MyAllContacts");
//这是最重要的设置 设置其动作ACtion
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,
new Intent(Intent.ACTION_VIEW, ContactsContract.Contacts.CONTENT_URI));
//设置图片
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON,
Intent.ShortcutIconResource.fromContext(this,
R.drawable.attached_image_placeholder));
//设置其显示效果为列表显示
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,
LiveFolders.DISPLAY_MODE_LIST);
setResult(RESULT_OK, intent);
/*} else {*/
//setResult(RESULT_CANCELED);
//}
finish();
}
}
最后还是要说一下有些资料参考书上写的数据源为“Content://contacts/live_folders/people”
即为联系人的信息 这确实没错,但我尝试他们点击之后的事件设置即为Intent.ACTION_CALL,发现其貌似存在很大的错误这无法直接设置进行拨打电话!所以这点需要注意!