当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 窗口小部件——Widget
窗口小部件——Widget
时间:2016-12-12作者:华清远见

1. 什么是Widget

在Android手机主界面上我们经常会看到很多图标,这些图标有的是系统应用程序,比如时钟,日期,设置等,也有用户安装的第三方应用,比如天气预报,游戏等,这种类似于Windows桌面快捷方式的小部件就是Widget。

2. Widget的开发步骤

(1) 创建一个XML布局文件,此布局文件用来显示定义在Widget中的组件,需要注意的是,Widget仅支持一下10类组件:
        ① FrameLayout
        ② LinearLayout
        ③ RelativeLayout
        ④ AnalogClock
        ⑤ Button
        ⑥ Chronometer
        ⑦ ImageButton
        ⑧ ImageView
        ⑨ ProgressBar
        ⑩ TextView

(2) 创建一个XML类型的Widget描述文件,这里需要在res资源文件夹下新建一个xml文件夹,将写好的XML文件放到里面去。XML文件格式如下:
        < appwidget-provider xmlns:android="//schemas.android.com/apk/res/android"
                android:minWidth="294dp"
                android:minHeight="146dp"
                android:updatePeriodMillis="0"
        android:initialLayout="@layout/app_widget"/>

其中minWidth和minHeight属性表示Widget的小宽度和小高度。updatePeriodMillis表示Widget更新间隔的时间(单位:毫秒),参数"0"表示不更新,若要更新,则要输入间隔的时长。使用此属性时会调用onUpdate方法来更新Widget。initialLayout参数就是第一步所创建的显示Widget的布局文件。

(3) 创建一个类,继承AppWidgetProvider(该类是BroadcastReceiver的子类,所以Widget类可以接收广播),AppWidgetProvider定义了一些接收Widget各种事件的方法,其中onUpdate方法较为常用,此方法主要用来更新Widget中的组件。

(4) 后一步就是在AndroidManifest.xml中注册一个receiver,格式如下:
        < receiver android:name=".WidgetDemo">
                < meta-data android:name="android.appwidget.provider"android:resource="@xml/appwidget" />
                < intent-filter>
                        < action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                < /intent-filter>
        < /receiver>

其中android:resource参数为第二步中创建的xml文件的资源ID。在< intent-filter>标签中必须使用标签定义一个APPWIDGET_UPDATE广播,表明Widget可以接收Update广播。只有这个广播必须定义,其他的广播并不需要< intent-filter>标签中定义。AppWidget框架会自动将除了Update广播外的其他AppWidget广播发送给AppWidgetProvider。

3. Widget实例

>> 本实例是在主页面上显示一个带图片的Widget,下面具体介绍一下Widget的创建过程。

(1) 新建一个Android工程,布局文件widgetmain.xml内容如下:
        < FrameLayout xmlns:android="//schemas.android.com/apk/res/android"android:layout_width="280dp"android:layout_height="123dp" >
        < ImageView android:id="@+id/imageview"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:src="@drawable/ic_launcher"/>
&nnbsp;       < /FrameLayout>

(2)在res资源文件夹下新建一个xml文件夹,新建一个XML文件(appwidget.xml),具体内容如下:
        < appwidget-provider xmlns:android="//schemas.android.com/apk/res/android"
                android:minWidth="294dp"
                android:minHeight="146dp"
                android:updatePeriodMillis="0"
        android:initialLayout="@layout/widgetmain"/>

(3)创建一个类,继承AppWidgetProvider,代码如下:
        import android.appwidget.AppWidgetManager;
        import android.appwidget.AppWidgetProvider;
        import android.content.Context;
        import android.widget.RemoteViews;
        public class WidgetDemo extends AppWidgetProvider
        {
                @Override
                public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)
                {
                        // TODO Auto-generated method stub
                        super.onUpdate(context, appWidgetManager, appWidgetIds);
                }
        }

(4)在AndroidManifest.xml中注册receiver
        < application
                android:icon="@drawable/ic_launcher"
                android:label="@string/app_name"
                android:theme="@style/AppTheme" >
                < receiver android:name=".WidgetDemo">
                        < meta-data android:name="android.appwidget.provider"android:resource="@xml/appwidget" />
                        < intent-filter>
                                < action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                        < /intent-filter>
                < /receiver>
        < /application>

在运行本实例后主界面并没有出现Widget,这里需要长按主页面,选中Widgets子项,找到刚才我们编写的程序,点击才可以看到,如图所示:

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)