Android中Widget实例

来源:互联网 发布:腾讯云注册域名流程 编辑:程序博客网 时间:2024/05/17 22:08

应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。

为了创建一个Widget,需要AppWidgetProviderInfo与AppWidgetProvider。AppWidgetProviderInfo主要为Widget描述metadata,如Widget的布局,更新频率和AppWidgetProvider类,这在xml里面定义。AppWidgetProvider定义基本的方法允许你基于广播事件与Widget进行交互。通过它,当Widget更新,可用,不可用或者删除的时候,你将收到广播。

下面的截屏显示本实例的效果图:

此Widget很简单,就是以闹铃面板为背景,在上面显示字符串。

由于涉及的文件比较多,先看一下文件存放目录图:

注:在res/drawable-ldpi/加入背景资源图片。可以看到res下面有三个文件夹:drawable-hdpi,drawable-ldpi,drawable-mdpi.三个文件夹分别对应不同的屏幕分辨率。

  • drawable-hdpi里面存放高分辨率的图片,如:WVGA (480x800),FWVGA (480x854)
  • drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
  • drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

为了使我们的程序满足不同分辨率的机型,Android在res下面分别建立不同文件夹,我们可以把不同分辨率机型的图片放在不同目录下面。

源代码如下:

首先,申明AppWidgetProvider类在应用的AndroidManifest.xml文件里

  • AndroidManifest.xml:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="com.android.test"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <application android:icon="@drawable/clockgoog_dial" android:label="@string/app_name">  
  7.         <receiver android:name=".TestWidget"  
  8.                   android:label="@string/app_name">  
  9.             <intent-filter>  
  10.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />  
  11.             </intent-filter>  
  12.             <meta-data android:name="android.appwidget.provider"  
  13.                        android:resource="@xml/widget_provider"  
  14.             />  
  15.         </receiver>  
  16.     </application>  
  17.     <uses-sdk android:minSdkVersion="7" />  
  18. </manifest>   

注:<receiver>元素需要andriod:name属性,它指明被Widget使用的AppWidgetProvider.

     <intent-filter>元素必须包含带有android:name属性的<action>元素。这一属性指明AppWigetProvider可接收ACTION_APPWIDGET_UPDATE广播。这是你必须明确声明的唯一广播。AppWidgetManager自动发送Widget广播到AppWidgetProvider。

     <meta-data>元素指明AppWidgetProviderInfo资源,需要如下属性:

  • android:name-指明元数据名称。使用android.appwidget.provider把数据指定为对AppWidgetProviderInfo的描述。
  • android:resource-指明AppWidgetProviderInfo资源的位置。

其次,增加AppWidgetProviderInfor元数据在res/xml/widget_provider.xml中:

  • res/xml/widget_provider.xml:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:minWidth="50dip"  
  4.     android:minHeight="50dip"  
  5.     android:updatePeriodMillis="10000"  
  6.     android:initialLayout="@layout/main"/>   

注:AppWidgetProviderInfo定义基本的Widget属性,如最小布局维数,初始的布局资源,更新Widget频率和在创建时间启动Activity的配置。在XML资源里使用单一的<appwidget-provider>元素定义AppWidgetProviderInfo对象并且把它保存在工程的res/xml/文件夹下。

然后,创建Widget布局文件在res/layout/main.xml中:

    • res/layout/main.xml:

    [xhtml] view plaincopyprint?
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:orientation="vertical"  
    4.     android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent"  
    6.     android:background="@drawable/clockgoog_dial">  
    7.       
    8.     <TextView    
    9.         android:id="@+id/textview"  
    10.         android:layout_width="fill_parent"   
    11.         android:layout_height="wrap_content"   
    12.         android:text="@string/hello"  
    13.         android:textSize="10px"  
    14.         android:textColor="#ff0000"/>  
    15. </LinearLayout>  

    注:你必须在XML里为你的Widget定义一个初始的布局文件,然后保存在工程的res/layout/目录下。如果你熟悉在XML中声明布局,那么创建Widget布局是简单的。你可以使用View对象设计你的Widget,然而你必须注意Widget基于RemoteViews,它并不支持布局或者view控件中的每一种。

    最后,使用AppWidgetProvider类在TestWidget.java中:

    注:继承于BroadcastReceiver的AppWidgetProvider类是一种很方便处理Widget广播的类。AppWidgetProvider只接收与Widget相关的事件广播,如当Widget更新,删除,可用和不可用的时候。当这些广播事件发生的时候,AppWidgetProvider收到如下的方法调用:onUpdated,onDeleted,onEnabled,onDisabled,onReceive。

    最重要的AppWidgetProvider回调函数是onUpdated,因为当每一个Widget增加的时候它都会被调用(除非你使用配置Activity)。如果你的Widget接收任意用户交互事件,那么你需要在回调函数中注册事件handler。如果你的Widget没有创建临时文件或者数据库,或者执行需要clean-up的工作,那么onUpdated可能是你需要注册的唯一回调函数。

     

    如果需要了解详细的Widget信息,请参考Android官方文档:file:///work/android-sdk-linux_x86-1.6_r1/docs/guide/topics/appwidgets/index.html。

    原创粉丝点击
    热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 白鞋子被晒黄了怎么办? 耐克空军一号白色发黄怎么办 空军一号破皮了怎么办 匡威鞋帆布破了怎么办 脚腕起疙瘩很痒怎么办 跑步后脚踝微疼怎么办 跑步跑得脚疼怎么办 nike air 鞋头脱胶怎么办 耐克空军一号磨脚怎么办 白鞋刷完变黄了怎么办 乔丹气垫坏了怎么办 气垫鞋气垫坏了怎么办 建行u盾忘记密码怎么办 工商银行u盾忘记密码怎么办 民生银行不给u盾怎么办 银行不给开u盾怎么办 有车有空想赚点外快怎么办 车被注册了滴滴怎么办 快手号手机丢了怎么办 手机号码不停收到验证码怎么办 手机网页滑动自动跳到最下面怎么办 网页一打开就跳至评论怎么办? 百度总出现重复的网页怎么办 苹果7一直处于系统升级页面怎么办 手机看百度文章总是跳转怎么办 美度舵手滑丝怎么办 小区房产证办不下来怎么办 美海军陆战队进驻台湾大陆怎么办? 束脚裤带子怎么办系 眼角弄伤了应该怎么办 浴盆下水盖坏了怎么办 冒险岛勋章多了怎么办 玉手镯取不下来怎么办?终极绝招! 陆金所收益低怎么办 陆金所登录密码忘记怎么办 陆金所理财逾期怎么办 死亡家属晚上来闹怎么办 开车撞到人家属闹要请护工怎么办 骑马与砍杀战团打下城市怎么办 我的脑子有问题怎么办 公司外派异地工作医保怎么办