- 浏览: 1076373 次
- 性别:
- 来自: 厦门
最新评论
-
aplixy:
谢谢分享,怎么没人顶,写的挺好,配图一目了然
setXfermode属性 -
zhao3976zhi:
[b][color=darkred][color=brown] ...
JAVA反射机制及应用例子 -
小才纸:
a nice demo.
ScheduledExecutorService的使用 -
fanlei123126:
,给力
EditText横屏时,弹出软件盘时不进行全屏 -
1320438999:
chaosmonkey 写道楼主有没有试试Handler的po ...
android 定时器的实现
Android AppWidget如何支持复杂的View
一直想知道如何在AppWidget里面添加 ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加 View都是通过RemoteView来做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很少:
在Dev Guide中有下面这段:
A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:
* FrameLayout
* LinearLayout
* RelativeLayout
And the following widget classes:
* AnalogClock
* Button
* Chronometer
* ImageButton
* ImageView
* ProgressBar
* TextView
Descendants of these classes are not supported.
所以从这里可以知道,为什么在AppWidget里添加EditText会显示LoadError了,因为本身它就不支持这些复杂的 Widget.
但我们又会有疑问了,为什么Google Search会有EditText呢?其实这些都是假象,并不是AppWidget支持EditText.
具体怎么回事,我猜有两种情况:
1.一种确实是EditText但确不是AppWidget 支持的,而是集成到Home里面去了。
具体可以参考这里:http://www.eoeandroid.com/archiver/tid-1729.html
2.最新的SDK 1.6中,显示在桌面的EditText只是一个ImageView,而这个ImageView的背景就是EditText的截图了。我们点中这个“EditText”后,会调起一个Activity,
而这个Activity就是复杂输入的EditText,并且会全屏显示。所以我们就误以会那是一个单纯的EditText.
最近看过HTC Hero Sense UI的人都看到了,它的AppWidget是确实支持复杂Widget的,比如:Bookmark Widget:ListView/GridView,Twitter Widget:EditText. 这些确实是我们可以看到的,但它是怎么做到的呢?我也很想知道,AppWidget支持到那么强大,甚至超过了本身AP的功能,很抢眼。但不管是怎么实现的,我想人家肯定是花了大力气去做到了,我猜想可能是将Google 提供的AppWidget进行了比较大的改动。我们查看一下framework下的appwidget:
可以看到,appwidget的文件很少,虽然不能说明什么,但按照正常的推理,文件少功能一般也强大不到哪里去,这种想法虽然有些牵强,但暂且就这样认为吧。
所以我想HTC一定是将这里给改动了,以支持复杂的Widget,有知道内情的透露一点最好了。
要知道RemoteView的功能很少,特别是对事件处理的能力,都需要通过PendingIntent,传到BroadcastReceiver 去处理。所以这里对一些事件处理也仅限于比较简单事件:比如说:Button Clicked,其它的我好像还没怎么用过,orz…. 对复杂的View:比如ListView(当然这里还不支持,打个比方),ListView里面那么多Item,要设置Listener,要传值,这些 RemoteView都不能像一个单纯的Activity那样处理,呵呵 ,扯远了,如果能的话,我也就没有必要这么费劲的写这篇博客了。
写这篇文章的时候,我已经实现了在 AppWidget里显示ListView/GridView这些复杂的Widget了,我这里只说显示,并不是说我已经能让AppWidget支持 ListView/GridView了。所以我这里更倾向于教你如何在AppWidget里支持显示ListView/GridView这些复杂的 Widget.
我们知道AppWidget只支持RemoteView,那哪些Widget是RemoteView呢,我来教你搜一下:
就是这些了,类名前面加了”@RemoteView”,和我前面列出的那些是不是一样的呢?–对了,就是这些了,所以以后你想知道你在AppWidget支持哪些Widget就可以像我这样去搜一下就知道了,这样最适时。
写到这里我已经将最关键的内容都已经写出来了,还不明白?
其实简单点讲就是在一个Widget类前面加上”@RemoteView”,加上了它就等于说RemoteView可以支持它, RemoteView支持就等于是AppWidget支持这它了。
好了,现在你只需要自定义一些你需要的Widget,加上”@RemoteView”标记,你就可以在AppWidget里使用它了。
关于如何自定义一个Widget你完全可以参照frameworks/base/core/java/android/widget已有的这些Widget.依样加一个。
其实如果你需要自定义一个Widget,比如说支持ListView,你可以先在一个activity里实现它,然后将它移到framework下面去。
这里说一下可能需要注意的地方:
1.如果有多个文件,需要Package的时候,名字最好按照这样的形式:android.widget.bookmark
其中bookmark就是你要添加一个Widget存放的地方,这样的话你就可以在frameworks/base/core/java/android/widget 目录下新增bookmark文件夹,将java文件放在这个目录下。
如果你新增的Widget只有一个java文件就可以不用这样了,可以完全按照已经存在的Widget的样子,直接将java文件放到frameworks/base/core/java/android/widget目录下。
2.资源文件存放:
frameworks/base/core/res/res
资源文件都放到这个目录下。
3.资源的引用:
要用这样的方式引用:com.android.internal.R.drawable.**
4.记着在这个Customer Widget类名前加上”@RemoteView”标记.
这些都做完了,你就已经将一个自定义的Widget添加到framework了。之后要做的工作就是编译整个工程了,重新生成SDK。
最后你就可以在AppWidget引用你新加的这个Widget了:com.widget.bookmark.***。
至此,你已经用上了你新加的这个Widget,并且可以加到AppWidget.
在新加Widget的时候可能会遇到的一些问题:
1.构造函数初始化问题。
如果在XML里写的layout不能直接指定哪个构造函数进行初始化,如果你不确定会跑哪个构造函数,最好在每个构造函数里对加上log,这样你就知道初始化时会跑哪个构造函数,并将初始化的工作加到里面。我当时就遇到了这个问题,因为用XML写layout,你不能显示调用哪个构造函数进行初始化,如果你将初始化的操作放到一个不会自动跑到的构造函数里面,那面你运行的时候就好像没添加到Widget一样。
2.其它的再说吧。
后继我可能会写如何添加Bookmark Widget(支持ListView/GridView,见过HTC Hero Sense UI吗,就是那个样子)到AppWidget,敬请期待!
一直想知道如何在AppWidget里面添加 ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加 View都是通过RemoteView来做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很少:
在Dev Guide中有下面这段:
引用
A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:
* FrameLayout
* LinearLayout
* RelativeLayout
And the following widget classes:
* AnalogClock
* Button
* Chronometer
* ImageButton
* ImageView
* ProgressBar
* TextView
Descendants of these classes are not supported.
所以从这里可以知道,为什么在AppWidget里添加EditText会显示LoadError了,因为本身它就不支持这些复杂的 Widget.
但我们又会有疑问了,为什么Google Search会有EditText呢?其实这些都是假象,并不是AppWidget支持EditText.
具体怎么回事,我猜有两种情况:
1.一种确实是EditText但确不是AppWidget 支持的,而是集成到Home里面去了。
具体可以参考这里:http://www.eoeandroid.com/archiver/tid-1729.html
2.最新的SDK 1.6中,显示在桌面的EditText只是一个ImageView,而这个ImageView的背景就是EditText的截图了。我们点中这个“EditText”后,会调起一个Activity,
而这个Activity就是复杂输入的EditText,并且会全屏显示。所以我们就误以会那是一个单纯的EditText.
最近看过HTC Hero Sense UI的人都看到了,它的AppWidget是确实支持复杂Widget的,比如:Bookmark Widget:ListView/GridView,Twitter Widget:EditText. 这些确实是我们可以看到的,但它是怎么做到的呢?我也很想知道,AppWidget支持到那么强大,甚至超过了本身AP的功能,很抢眼。但不管是怎么实现的,我想人家肯定是花了大力气去做到了,我猜想可能是将Google 提供的AppWidget进行了比较大的改动。我们查看一下framework下的appwidget:
pjq@gentoo-pjq ~/android/donut $ ls frameworks/base/core/java/android/appwidget/ -lh total 60K -rw-r--r-- 1 pjq users 7.9K 2009-09-29 21:49 AppWidgetHost.java -rw-r--r-- 1 pjq users 12K 2009-09-29 21:49 AppWidgetHostView.java -rw-r--r-- 1 pjq users 14K 2009-09-29 21:49 AppWidgetManager.java -rw-r--r-- 1 pjq users 691 2009-09-29 21:49 AppWidgetProviderInfo.aidl -rw-r--r-- 1 pjq users 5.6K 2009-09-29 21:49 AppWidgetProviderInfo.java -rwxr-xr-x 1 pjq users 6.3K 2009-09-29 21:49 AppWidgetProvider.java -rw-r--r-- 1 pjq users 1.5K 2009-09-29 21:49 package.html
可以看到,appwidget的文件很少,虽然不能说明什么,但按照正常的推理,文件少功能一般也强大不到哪里去,这种想法虽然有些牵强,但暂且就这样认为吧。
所以我想HTC一定是将这里给改动了,以支持复杂的Widget,有知道内情的透露一点最好了。
要知道RemoteView的功能很少,特别是对事件处理的能力,都需要通过PendingIntent,传到BroadcastReceiver 去处理。所以这里对一些事件处理也仅限于比较简单事件:比如说:Button Clicked,其它的我好像还没怎么用过,orz…. 对复杂的View:比如ListView(当然这里还不支持,打个比方),ListView里面那么多Item,要设置Listener,要传值,这些 RemoteView都不能像一个单纯的Activity那样处理,呵呵 ,扯远了,如果能的话,我也就没有必要这么费劲的写这篇博客了。
写这篇文章的时候,我已经实现了在 AppWidget里显示ListView/GridView这些复杂的Widget了,我这里只说显示,并不是说我已经能让AppWidget支持 ListView/GridView了。所以我这里更倾向于教你如何在AppWidget里支持显示ListView/GridView这些复杂的 Widget.
我们知道AppWidget只支持RemoteView,那哪些Widget是RemoteView呢,我来教你搜一下:
pjq@gentoo-pjq ~/android/donut/frameworks/base/core/java/android/widget $ grep -i -n -A 1 @remoteview *.java AbsoluteLayout.java:40:@RemoteView AbsoluteLayout.java-41-public class AbsoluteLayout extends ViewGroup { -- AnalogClock.java:39:@RemoteView AnalogClock.java-40-public class AnalogClock extends View { -- Button.java:58:@RemoteView Button.java-59-public class Button extends TextView { -- Chronometer.java:45:@RemoteView Chronometer.java-46-public class Chronometer extends TextView { -- FrameLayout.java:47:@RemoteView FrameLayout.java-48-public class FrameLayout extends ViewGroup { -- ImageButton.java:66:@RemoteView ImageButton.java-67-public class ImageButton extends ImageView { -- ImageView.java:55:@RemoteView ImageView.java-56-public class ImageView extends View {现在没什么问题。 -- LinearLayout.java:44:@RemoteView LinearLayout.java-45-public class LinearLayout extends ViewGroup { -- ProgressBar.java:122:@RemoteView ProgressBar.java-123-public class ProgressBar extends View { -- RelativeLayout.java:66:@RemoteView RelativeLayout.java-67-public class RelativeLayout extends ViewGroup { -- TextView.java:186:@RemoteView TextView.java-187-public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {
就是这些了,类名前面加了”@RemoteView”,和我前面列出的那些是不是一样的呢?–对了,就是这些了,所以以后你想知道你在AppWidget支持哪些Widget就可以像我这样去搜一下就知道了,这样最适时。
写到这里我已经将最关键的内容都已经写出来了,还不明白?
其实简单点讲就是在一个Widget类前面加上”@RemoteView”,加上了它就等于说RemoteView可以支持它, RemoteView支持就等于是AppWidget支持这它了。
好了,现在你只需要自定义一些你需要的Widget,加上”@RemoteView”标记,你就可以在AppWidget里使用它了。
关于如何自定义一个Widget你完全可以参照frameworks/base/core/java/android/widget已有的这些Widget.依样加一个。
其实如果你需要自定义一个Widget,比如说支持ListView,你可以先在一个activity里实现它,然后将它移到framework下面去。
这里说一下可能需要注意的地方:
1.如果有多个文件,需要Package的时候,名字最好按照这样的形式:android.widget.bookmark
其中bookmark就是你要添加一个Widget存放的地方,这样的话你就可以在frameworks/base/core/java/android/widget 目录下新增bookmark文件夹,将java文件放在这个目录下。
如果你新增的Widget只有一个java文件就可以不用这样了,可以完全按照已经存在的Widget的样子,直接将java文件放到frameworks/base/core/java/android/widget目录下。
2.资源文件存放:
frameworks/base/core/res/res
资源文件都放到这个目录下。
3.资源的引用:
要用这样的方式引用:com.android.internal.R.drawable.**
4.记着在这个Customer Widget类名前加上”@RemoteView”标记.
这些都做完了,你就已经将一个自定义的Widget添加到framework了。之后要做的工作就是编译整个工程了,重新生成SDK。
最后你就可以在AppWidget引用你新加的这个Widget了:com.widget.bookmark.***。
至此,你已经用上了你新加的这个Widget,并且可以加到AppWidget.
在新加Widget的时候可能会遇到的一些问题:
1.构造函数初始化问题。
如果在XML里写的layout不能直接指定哪个构造函数进行初始化,如果你不确定会跑哪个构造函数,最好在每个构造函数里对加上log,这样你就知道初始化时会跑哪个构造函数,并将初始化的工作加到里面。我当时就遇到了这个问题,因为用XML写layout,你不能显示调用哪个构造函数进行初始化,如果你将初始化的操作放到一个不会自动跑到的构造函数里面,那面你运行的时候就好像没添加到Widget一样。
2.其它的再说吧。
后继我可能会写如何添加Bookmark Widget(支持ListView/GridView,见过HTC Hero Sense UI吗,就是那个样子)到AppWidget,敬请期待!
评论
5 楼
x729461219
2012-10-25
楼主,你说后继你可能会写如何添加Bookmark Widget,写了米有?如果写了能给个链接或者发到我的邮箱吗?729461219@qq.com,谢谢了
4 楼
无愧衾影
2012-02-23
还没有做过呢,先储存知识,会有用到的时候,楼主牛啊
3 楼
lujl1988
2011-06-16
楼主!能否加我qq,请教你一个问题!394365569,谢谢
2 楼
hhww0101
2010-06-24
很期待,进度要快哈!不然被别人写出来老哈!
1 楼
abbyhefang
2010-04-01
楼主很强大哈。
可否给个简单的例子呢? 期待。
可否给个简单的例子呢? 期待。
发表评论
-
推荐安卓开发神器(里面有各种UI特效和实例)
2013-11-28 10:27 5981网上有很多开源的安卓类库很好用,对于刚学习安卓的童鞋亦或者 ... -
收藏的Android非常好用的组件或者框架。
2013-10-31 23:27 3244推荐安卓开发神器(里面有各种UI特效和android代码库 ... -
10个iPhone开发网站、论坛、博客
2013-01-11 22:54 206整理了一下手中的iPhone开发网站、论坛和博客,精选了 ... -
android textview滚动条
2012-06-12 10:17 6013推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
修改光标颜色
2012-05-30 10:44 2628推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
EditText横屏时,弹出软件盘时不进行全屏
2012-05-12 10:49 2538推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
Android平台的音乐资源管理与播放
2012-04-25 14:24 2494推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
Android 之 远程图片获取和本地缓存
2012-04-25 14:08 1869推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
旋转中 android 的视图按钮
2012-04-25 09:47 3883推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
android横竖屏切换参数
2012-04-20 11:43 2300推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
ZXing改横屏识别为竖屏识别
2012-04-17 17:39 5000推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
android 抗锯齿效果
2012-04-12 14:00 2332推荐安卓开发神器(里面有各种UI特效和android代 ... -
一些小功能的总结
2012-04-07 11:51 1581推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
Android类库打包方法探究
2012-04-07 11:46 2706推荐安卓开发神器 ... -
计算当前日期所在周的周一和周日
2012-04-06 16:35 2761推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
setXfermode属性
2012-03-30 14:20 21673推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
Android强制为自身应用设置实现多语言
2012-03-22 16:47 3317推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
JAVA中用CALENDAR类计算周和周的起始日期(转)
2012-03-19 10:18 12975推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
资源类型
2012-03-16 15:13 1571推荐安卓开发神器(里面有各种UI特效和android代码库实 ... -
Android Market 链接的生成与分享
2012-02-24 11:35 1347推荐安卓开发神器(里面有各种UI特效和android代码库实 ...
相关推荐
在QT中,Widget是构成用户界面的基本元素,它可以是按钮、文本框、标签等。当需要实现旋转切换效果时,我们通常会使用QGraphicsView和QGraphicsScene这两个组件。QGraphicsView提供了对复杂图形和动画的高级渲染,而...
【标题解析】 "Widget炫酷特效 (宏基扇子型效果)" 提示我们这是一个关于Widget特效的项目,...通过这个项目,可以深入学习和实践这些技能,同时也能了解到如何将品牌元素融入到UI设计中,提升产品的独特性和吸引力。
基于Qt+widget开发的各种炫酷的圆形进度条组件+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于Qt+widget开发的各种炫酷的圆形进度条组件...
在Android开发中,Widget是应用程序在主屏幕上的小型视图,它们可以提供用户快速访问功能或展示信息。...CanvasDemo可能就是一个很好的起点,它将引导我们深入探索在Widget中如何利用Canvas来创造出独特的视觉特效。
安装和使用此类Widget通常很简单,用户只需在主屏幕上长按,选择“添加Widget”,然后找到“Widget炫酷特效 (宏基扇子型效果)”并拖动到合适的位置。设置可能包含调整动画速度、透明度等选项,以满足用户的个性化...
"Widget工具制作教程.pdf"这份文档很可能详述了Widget开发的工具使用方法。在Widget开发过程中,开发者通常会用到以下几种工具: 1. **IDE(集成开发环境)**: 例如Android Studio对于Android平台的Widget开发,...
- Android Widget是Android系统的一部分,可以在主屏幕上显示简化的应用界面。 - Widget由XML布局文件定义,可以通过AppWidgetProvider类进行更新和控制。 - AppWidgetProvider是Android系统用来接收广播事件的...
其Widget功能让用户可以方便地将视频嵌入到个人网页或社交媒体,极大地促进了内容的传播。据统计,YouTube占据了互联网视频观看的大份额,并消耗了大量的网络带宽。 - **Slide**:Slide专注于在线幻灯片制作,...
将AppWidget与Service结合使用,可以实现从桌面小部件触发后台服务进行特定任务,如定时更新、远程控制等功能。 **AppWidget启动Service** 1. **创建AppWidget**: 首先,你需要创建一个AppWidget,定义其布局和...
在Android开发中,`appWidget` 是一种可以在用户主屏幕上显示的小部件,它提供了一种无需打开应用程序就能与用户交互的方式。本篇文章将深入探讨如何使用`appWidget`来启动一个`Activity`。 首先,我们需要了解`app...
一个界面可以有多个widget,通过不同的widget可以在一个界面上分别显示来自不同来源(网络服务)的信息。比如在blog的页面上通过多个widget同时显示自己在yupoo的相片、在饭否的言语、在last.fm记录的歌曲、豆瓣的...
2. **为父Widget预留空间**:在布局管理器(如QVBoxLayout、QHBoxLayout或QGridLayout)中,可以设置一个占位符或者使用`addStretch()`方法,预留位置以便于后续动态添加子Widget。 3. **动态添加子Widget**:使用...
Widget,这个词源自英语,是一个通用术语,用来描述各种小型应用程序或组件,它们可以在不同平台上以小窗口或小框的形式呈现,为用户提供便捷的功能或信息展示。Widget广泛应用于网页、系统桌面、移动设备以及社交...
对于Android开发者来说,使用Axure制作Widget原型可以帮助他们在设计阶段更好地理解和规划应用界面。这个“android axure widget包”就是一组专门针对Android平台的Axure组件库,由用户自己制作并分享。 标题中的...
一个界面可以有多个widget,通过不同的widget可以在一个界面上分别显示来自不同来源(网络服务)的信息。比如在blog的页面上通过多个widget同时显示自己在yupoo的相片、在饭否的言语、在last.fm记录的歌曲、豆瓣的...
5. **数据集成**:Widget可以集成各种数据服务,例如IP查询、股票信息等,使用户可以快速获取所需信息。 **Widget的发展与商业潜力** 随着Widget的流行,它们逐渐成为了一种商业机会。Mybloglog就是一个成功的例子...
在Android平台上,Widget是应用程序的一种轻量级交互方式,它可以在主屏幕上显示实时信息并提供简单操作,无需打开完整的应用程序。本教程将深入探讨如何在Android中实现一个Widget闹钟功能,这对于Android开发者来...
WidgetProvider可以通过发送自定义Intent来更新RemoteViews,从而实现AppWidget的动态展示。此外,还可以使用AlarmManager来定期更新AppWidget,确保信息的时效性。 ### 三、启动与运行过程 #### 3.1 启动流程 当...