`
he91_com
  • 浏览: 410806 次
文章分类
社区版块
存档分类
最新评论

widget基础学习

 
阅读更多

其实Android API开发指南中的App Widgets章节 已经说得很清楚了,下面只是对自己的理解进行一次梳理。

--
AppWidget 就是HomeScreen上显示的小部件,提供直观的交互操作。通过在HomeScreen中长按,在弹出的对话框中选择Widget部件来进行创建,长按部件后并拖动到垃圾箱里进行删除。同一个Widget部件可以同时创建多个。

AppWidget的实现主要涉及到以下类:
AppWidgetProvider
RemoteViews
AppWidgetManager


1.
首先需要提供一个定义了Widget界面布局的XML文件(位于res/layout/..),需要注意的是使用的组件必须是RemoteViews所支持的,目前原生API中支持的组件如下:
FrameLayout
LinearLayout
RelativeLayout

AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView


*如果使用了除此之外的组件,则在Widget创建时会导致android.view.InflateExceptionn异常。


PS:这就导致有一些功能或样式无法实现,如很基本的list或文本编辑框都是无法直接实现的。如果想自定义Widget中的View的话只能通过修改framework来提供相应组件的支持。

2.
然后需要提供一个xml文件来定义Widget的基本属性,放置到res/xml/..目录下。
如果使用的是Eclipse可按如下操作:
1) 在res/目录下创建xml/目录
2)创建xml文件(名字可任意),选择类型为AppWidgetProvider
3)在弹出的便捷界面进行参数设置

主要设置的参数如下:
minWidth: 定义Wdiget组件的宽度
minHeight: 定义Wdiget组件的高度
updatePeriodMillis: 更新的时间周期
initialLayout: Widget的布局文件
configure: 如果需要在启动前先启动一个Activity进行设置,在这里给出Activity的完整类名(后面会说到,与一般Activity的实现有些许差别)

*Widget大小的计算 :(单元格数*74)-2,API上说是为了防止像素计算时的整数舍入导致错所以-2...不是很明白

一个完整的样例:

3.
xml都定义好后,接下来就是创建一个继承自AppWidgetProvider的子类,AppWidgetProvider实际上就是一个BroadcastReceiver,里面提供了以下函数:
onReceive(Context, Intent)
onUpdate(Context , AppWidgetManager, int[] appWidgetIds)
onEnabled(Context)
onDeleted(Context, int[] appWidgetIds)
onDisabled(Context)
可通过重写以上函数来监听Widget状态的变化并进行相应的处理。

以上函数具体调用情况归纳如下:
[启动 - 无confiure Activity]
onReceive
onEnabled —— 第一个widget被显示
onReceive
onUpdate —— 刷新界面

[启动 - 带confiuration Activity]
onReceive
onUpdate

[拖动]
<无状态变化>

[周期更新]
onReceive
onUpdate

[删除]
onReceive
onDeleted —— widget被删除
onReceive
onDisabled —— 最后一个widget被移除

[启动时位置不够]
onReceive
onEnabled
onReceive
onUpdate
onReceive
onDeleted
onReceive
onDisabled

*每次状态的变化会触发onReceive,一般该函数是不需要重写的。

简单了解AppWidgetProvider之后,我们来看具体实现。
这里创建一个MyAppWidgetProvider继承AppWidgetProvider:

其中onUpdate顾名思义是对Widget进行更新的,前面定义的更新周期就是作用于该函数的。
Widget的更新与Activity不同,必须借助于RemoteViews和AppWidgetMananger。具体实现如下:

其中需要注意的是,虽然RemoteViews参数都是一样的,但是对于每个Widget最好都新创建一个再进行传递,否则会导致一些错误。具体可参考AppWidget RemoteViews 内存溢出

其他函数的可以根据需要实现。

由于无法获取到RemoteViews创建的界面中的元素,对于Widget中组件的操作只能通过RemoteViews所提供的有限的函数进行,常用的有:
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
setProgressBar(int viewId, int max, int progress, boolean indeterminate)
setTextViewText(int viewId, CharSequence text)
setViewVisibility(int viewId, int visibility)
详细函数列表可参考API中的RemoteViews类

4.
最后,更新AndroidManifest.xml。
AppWidgetProvider对应一个receiver属性: 5.
提供Configuration Activity

Configuration Activity是一个在Widget启动前先启动的Activity,方便用户对Widget的属性进行设置。

在res/xml/...下对应的"属性文件"中添加configure字段指定启动的Activity,并在AndroidManifest.xml中该Activity下提供一个action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntenFilter。

需要注意的是,
如果设置了Configure属性,则必须在指定的Activity中进行如下处理:
1.在onCreate中setContentView()函数前添加setResult(RESULT_CANCLE) ,这样如果在Activity初始化完成前按下了BACK按键,则Widget不会启动;
2.在setContentView()函数之后(不一定要在onCreate中,在Activity退出前即可),添加如下设置以指定需要启动的Widget:否则会导致退出Activity后Widget不启动。

>> Widget创建步骤汇总:
1.定义Widget布局XML -> res/layout/...
2.定义Widget属性文件(xml) -> res/xml/...
3. 创建AppWidgetProider子类,实现onUpdate()等函数,在manifest中注册receiver,添加一个action为 android.appwidget.action.APPWIDGET_UPDATE 的IntentFilter,并添加如下<meta- data>标识:4. 创建Coniguration Activity(注意处理好setResult),添加到属性文件中的Configure属性,在manifest中注册activity,添加一个 action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntentFilter

最后附上一个完整的例子,
实现思路如下:
1. 提供一个Configuration Activity,这里只简单显示一行文字;
2.退出后Widget启动;
3.点击Widget中的按钮会启动一个Activity。
分享到:
评论

相关推荐

    S60widget开发学习资料

    ### S60 Widget开发学习资料知识点详述 #### 一、S60平台与Widget概述 - **S60平台**: S60是诺基亚为智能手机开发的一个软件平台,基于Symbian操作系统。它提供了丰富的功能和服务,适用于多媒体、通信、互联网...

    flutter构建widget树demo,flutter资料学习demo,dart语言学习基础

    flutter基础学习demo,该demo中利用widget树原理构建复杂的布局和效果,其中使用了动态路由,以及手势;通过该demo可以很好的学习的如何布局,手势的使用以及动态路由的使用,通过这些可以很快的了解到跨平台flutter...

    Widget工具制作教程

    在IT行业中,Widget工具通常指的是小型、轻量级的应用程序,它们可以被嵌入到桌面、网站或移动设备上,为用户提供便捷的功能访问。...通过学习和实践,你不仅可以创建出实用的Widget,还能提升自己的编程和设计技能。

    JIL Widget 范例

    1. **Widget基础知识**:Widget是JIL平台上的基本组件,类似于Android中的Activity或iOS中的ViewController。每个Widget都有自己的生命周期,包括创建、显示、暂停、恢复和销毁等阶段。 2. **布局管理**:JIL ...

    安卓Widget小组件相关-WidgetTest.zip

    1. **创建Widget的基础结构** 创建一个Android Widget首先需要在`AndroidManifest.xml`中定义一个BroadcastReceiver,它是Widget的主要控制器。同时,需要创建一个继承自`AppWidgetProvider`的类,这个类会监听并...

    flutter学习资料实例,构建复杂widget树和对动态路由的学习

    总的来说,这个压缩包提供了一个良好的起点,帮助学习者逐步掌握Flutter的基础和核心概念,包括Widget的构建、布局设计、手势处理以及动态路由的使用,这些都是构建高效、美观跨平台应用的关键技能。通过实践和深入...

    android widget

    1. **Widget基础概念**: - Android Widget是一种轻量级的应用程序组件,可以在桌面或主屏幕上显示和交互。 - 用户可以通过长按主屏幕并选择“小部件”来添加Widget,然后选择对应的应用程序。 2. **...

    android的widget桌面开关例子

    总结起来,这个“android的widget桌面开关例子”涵盖了Android Widget的基础知识,包括创建AppWidgetProvider、定义Widget布局、处理用户交互以及权限管理。虽然由于权限限制未能实现完整的功能,但它为我们提供了...

    时间widget的Demo

    总结来说,这个【时间widget的Demo】涵盖了Android桌面小部件的基础开发流程,包括声明Widget、创建`AppWidgetProvider`子类、更新Widget视图、设置定时更新以及设计Widget布局。通过学习这个示例,开发者可以了解到...

    QT_学习笔记widget

    ### QT学习笔记Widget详解 #### 一、QT基础概念与组件使用 在开始探讨QT中的Widget之前,我们先简要回顾一下QT的基础概念。 - **QT框架简介**:QT是一个跨平台的应用开发框架,支持Windows、Linux、Mac OS等多种...

    安卓看笑话widget源码

    开发者可以在此基础上定制Widget的外观,使其更具吸引力。 此外,`JokeLikeV1.0.apk`和`AppLocknewV2.0.apk`看起来是两个不相关的应用文件,可能是因为上传时误放入的,或者它们在项目中扮演了某种辅助角色,如作为...

    Android Widget示例

    1. **Widget基础**: - Android Widget是Android操作系统提供的桌面组件,可以是时钟、天气预报、音乐播放控制等,它们在主屏幕上提供直观、便捷的交互。 - Widget由`AppWidgetProvider`类负责管理和更新,这是一...

    android widget实例下载

    1. **Android Widget基础** - **定义**:Android小部件是轻量级的UI组件,可以在主屏幕或其他可放置小部件的应用上显示和操作。 - **类型**:包括时钟小部件、按钮小部件、列表小部件等,可以自定义设计。 - **...

    android时钟widget小部件源代码

    1. **AppWidgetProvider**: 这是Android Widget的基础,它是一个BroadcastReceiver子类,用于监听并响应Widget相关的广播事件,如Widget的添加、删除或更新。 2. **布局文件**(如WidgetClock1.xml): 定义了Widget...

    诺基亚 Web Widget 开发入门及实例

    诺基亚Web Widget开发入门及实例是一份专为开发者准备的详细教程,旨在引导初学者进入诺基亚手机上的Widget应用程序开发领域...通过学习和实践,开发者可以创造出富有创意和实用性的Widget,丰富诺基亚用户的手机体验。

    Android_UI_Widget

    总的来说,“Android_UI_Widget”涵盖了Android开发中与界面组件相关的广泛知识,从基础到进阶,从标准Widget到自定义组件,为开发者构建美观、高效的用户界面提供了全面的指导。通过学习和实践,开发者可以更好地...

    Widget桌面

    这个资源包包含了基础的Widget桌面插件的源代码,适合初学者或希望拓展Widget功能的开发者进行学习和参考。 首先,我们要理解Widget的基本概念。在Android中,Widget主要分为两种类型:AppWidget和HomeScreenWidget...

    android之appwidget(一)简单appwidget

    首先,我们需要理解AppWidget的基础结构。一个AppWidget由两部分组成:AppWidget提供者(AppWidgetProvider)和布局文件。AppWidget提供者是Android的BroadcastReceiver子类,它负责处理AppWidget的生命周期事件,如...

    AndroidStudio简单实现单击Widget打开Activity

    在Android应用开发中,Widget是桌面小部件,它能让用户在主屏幕上与应用程序进行交互,而无需实际打开应用。Android Studio作为官方推荐的集成...通过深入学习和实践,你可以创建出功能更丰富、用户体验更好的Widget。

Global site tag (gtag.js) - Google Analytics