• 创建 widget 窗口小组件


    随着android的手机屏幕越来越大,为了丰富屏幕内容 app widget(窗口小组件)被越来越多的应用所使用。app widget 有什么好处呢?它可以在不启动应用程序的情况下,让用户在屏幕上有一块交互窗口和程序入口点。

    这是我手机自带的天气预报app widget效果。

    为了创建一个应用程序的widget我们需要创建三个组件:

    (1)给widget创建一个布局资源。

    res/layout/nview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
    
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="打开网页" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="打开照相机" />
    
        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="打开电话本" />
    
    </LinearLayout>
    View Code

    Widget的布局不是支持所有Android组件的。目前仅支持一下组件。

    FrameLayout 
    LinearLayout 
    RelativeLayout 

    AnalogClock 
    Button 
    Chronmeter 
    ImageButton 
    ImageView 
    ProgressBar 
    TextView 

    如果使用了weidget不支持的组件。那么在Widget创建时会导致android.view.InflateExceptionn异常 

    (2)创建widget描述文件。该文件是xml类型。位于res/xml中

    res/xml/my_widget.xml

    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/nview"
        android:minHeight="40dp"
        android:minWidth="200dp"
        android:previewImage="@drawable/ic_launcher"
        android:resizeMode="horizontal|vertical"
        android:configure="com.example.testdemo.MainActivity"
        android:updatePeriodMillis="360000" >
    
    </appwidget-provider>
    View Code

    appwidget-provider标签能够描述widget元数据。该元数据使用以下属性来描述weiget

    initialLayout: widget的布局资源。

    minWidth/minHeight: widget的最小宽度和最小高度。

    resizeMode: (这个属性是在Android 3.1中引入的)通过给resizeMode设置horizontal和vertical的组合,允许在你指定的方向上调整widget的大小,设置为none会禁止调整大小。

    lable: 小组件标题,在小组件列表中能看到。

    updatePeriodMillis: widget更新最小周期,单位毫秒。Android将会以该设定的时间唤醒设备,来更新主屏幕上的widget,这个时间周期不能小于30分钟。最好每天更新一到两次

    icon: 你的widget 在小组件管理器中的图标。你可以指定icon为你的weiget的缩略图。方便用户了解你的widget样子。

    configure:当widget添加到屏幕中时,可以启动一个Activity,该Acitvity可以对widget进行设置,该属性必须使用Activity的完全限定名,如上代码中的。

    perviewImage: (Android3.0中引入的)设置widget在小组件管理器中的预览效果。而不是显示其图标icon。其实这个和icon差不多。最好还是用这个。

    (3)创建一个继承于AppWidgetProvider的Intent接受类,AppWidgetProvider封装了对Intent的处理,并提供了更新,删除,启用,禁用等事件的处理程序,在该类中我们可以从服务器端获得数据并进行处理并在Widget中显示等。

    package com.example.testdemo;
    
    import android.appwidget.AppWidgetManager;
    import android.appwidget.AppWidgetProvider;
    import android.content.Context;
    import android.content.Intent;
    
    public class MyAppWidget extends AppWidgetProvider {
    
        @Override
        public void onDeleted(Context context, int[] appWidgetIds) {
            // Widget组件被删除时触发
            super.onDeleted(context, appWidgetIds);
        }
    
        @Override
        public void onDisabled(Context context) {
            // 最后一个Widget组件关闭时触发
            super.onDisabled(context);
        }
    
        @Override
        public void onEnabled(Context context) {
            // 第一个Widget组件启动时触发 
            super.onEnabled(context);
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // 没接收一次广播消息就调用一次,使用频繁,不管什么操作都最先触发该函数 
            super.onReceive(context, intent);
        }
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                int[] appWidgetIds) {
            // 当更新widget时调用
            super.onUpdate(context, appWidgetManager, appWidgetIds);
        }
    }
    View Code

    (4)向AndroidManifest.xml中注册

      <receiver android:name=".MyAppWidget" >
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
                <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/my_widget" >
                </meta-data>
            </receiver>
    View Code

    注意:使用的是Receiver标签,为了把一个broadcaset Receiver 指定为一个 app widget。需要添加以下两个标签。

    1.一个用于"android.appwidget.action.APPWDIGET_UPDATE" 动作的intent filter。

    2.一个对描述文件widget的xml引用。这个文件描述了widget的设置。

    更多属性参加Android api

  • 相关阅读:
    IIs6基础上发布WebApi注意事项
    VS2010下开发WebApi 基本步骤
    C# 两个datatable中的数据快速比较返回交集或差集
    myeclipse快捷键使用
    Java中时间
    数组排序后插入
    所有的jsp页面都放到WEB-INF目录
    jsp内置对象浅谈
    JSP九大内置对象的作用和用法总结?
    JSP九大内置对象及四个作用域
  • 原文地址:https://www.cnblogs.com/ywtk/p/3849010.html
Copyright © 2020-2023  润新知