关于Android Widget实例学习教程

关于Android Widget实例学习教程


    关于Android Widget实例学习教程是本文要介绍的内容,主要是来了解并学习Android Widget实例的应用,具体内容的实现来看本文详解。应用程序窗口小部件(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文件里 :

       
       
    1. AndroidManifest.xml:   
    2.  
    3. <?xml version="1.0" encoding="utf-8"?>    
    4. <manifest xmlns:android="http://schemas.android.com/apk/res/android"    
    5.       package="com.android.test"    
    6.       android:versionCode="1"    
    7.       android:versionName="1.0">    
    8.     <application android:icon="@drawable/clockgoog_dial" android:label="@string/app_name">    
    9.         <receiver android:name=".TestWidget"    
    10.                   android:label="@string/app_name">    
    11.             <intent-filter>    
    12.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />    
    13.             </intent-filter>    
    14.             <meta-data android:name="android.appwidget.provider"    
    15.                        android:resource="@xml/widget_provider"    
    16.             />    
    17.         </receiver>    
    18.     </application>    
    19.     <uses-sdk android:minSdkVersion="7" />    
    20. </manifest>     
    21. <?xml version="1.0" encoding="utf-8"?> 
    22. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    23.       package="com.android.test" 
    24.       android:versionCode="1" 
    25.       android:versionName="1.0"> 
    26.     <application android:icon="@drawable/clockgoog_dial" android:label="@string/app_name"> 
    27.         <receiver android:name=".TestWidget" 
    28.                   android:label="@string/app_name"> 
    29.             <intent-filter> 
    30.                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    31.             </intent-filter> 
    32.             <meta-data android:name="android.appwidget.provider" 
    33.                  android:resource="@xml/widget_provider" 
    34.             /> 
    35.         </receiver> 
    36.     </application> 
    37.     <uses-sdk android:minSdkVersion="7" /> 
    38. </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中:

       
       
    1. res/xml/widget_provider.xml:   
    2.  
    3. <?xml version="1.0" encoding="utf-8"?>    
    4. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"    
    5.     android:minWidth="50dip"    
    6.     android:minHeight="50dip"    
    7.     android:updatePeriodMillis="10000"    
    8.     android:initialLayout="@layout/main"/>     
    9. <?xml version="1.0" encoding="utf-8"?> 
    10. <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    11.  android:minWidth="50dip" 
    12.  android:minHeight="50dip" 
    13.  android:updatePeriodMillis="10000" 
    14.  android:initialLayout="@layout/main"/>   

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

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

       
       
    1. res/layout/main.xml:   
    2.  
    3. <?xml version="1.0" encoding="utf-8"?>    
    4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    5.     android:orientation="vertical"    
    6.     android:layout_width="fill_parent"    
    7.     android:layout_height="fill_parent"    
    8.     android:background="@drawable/clockgoog_dial">    
    9.         
    10.     <TextView      
    11.         android:id="@+id/textview"    
    12.         android:layout_width="fill_parent"     
    13.         android:layout_height="wrap_content"     
    14.         android:text="@string/hello"    
    15.         android:textSize="10px"    
    16.         android:textColor="#ff0000"/>    
    17. </LinearLayout>    
    18. <?xml version="1.0" encoding="utf-8"?> 
    19. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    20.     android:orientation="vertical" 
    21.     android:layout_width="fill_parent" 
    22.     android:layout_height="fill_parent" 
    23.     android:background="@drawable/clockgoog_dial"> 
    24.       
    25.  <TextView    
    26.   android:id="@+id/textview" 
    27.      android:layout_width="fill_parent"   
    28.      android:layout_height="wrap_content"   
    29.      android:text="@string/hello" 
    30.    android:textSize="10px" 
    31.      android:textColor="#ff0000"/> 
    32. </LinearLayout> 

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

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

       
       
    1. package com.android.test;    
    2. import android.appwidget.AppWidgetManager;    
    3. import android.appwidget.AppWidgetProvider;    
    4. import android.content.Context;    
    5. public class TestWidget extends AppWidgetProvider {    
    6.     /** Called when the activity is first created. */    
    7.     @Override    
    8.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,    
    9.             int[] appWidgetIds) {    
    10.         super.onUpdate(context, appWidgetManager, appWidgetIds);    
    11.     }    
    12. }    
    13. package com.android.test;  
    14. import android.appwidget.AppWidgetManager;  
    15. import android.appwidget.AppWidgetProvider;  
    16. import android.content.Context;  
    17. public class TestWidget extends AppWidgetProvider {  
    18.     /** Called when the activity is first created. */  
    19.  @Override  
    20.  public void onUpdate(Context context, AppWidgetManager appWidgetManager,  
    21.    int[] appWidgetIds) {  
    22.   super.onUpdate(context, appWidgetManager, appWidgetIds);  
    23.  }  
    24. }  

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

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

    小结:关于Android Widget实例学习教程的内容介绍完了,希望通过Android Widget实例内容的学习能对你有所帮助。

    【编辑推荐】

    • 1
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值