- 浏览: 478198 次
- 性别:
- 来自: 北京
最新评论
-
fatalfeel:
Irrlicht 3d Engine is full open ...
转:Android世界的15款开源的游戏开发引擎 -
diyangxia:
BigDecimal怎么初始化全局变量呢
android如何保留小数点后x位数字 -
c1230v:
这是一个程序员应该用的方法吗?求靠谱一点
转:android WebView 控件加载本地sdcard中html文件图片的问题 -
dingbuoyi:
楼主是天才 真牛逼
转:Progressbar-设置自己的样式 -
panxiaoming2008:
记住:显示本地文件时 必须使用APK'>file:/// ...
Android使用WebView加载本地资源
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:
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,敬请期待!
发表评论
-
service学习
2012-05-16 00:41 845http://www.cnblogs. ... -
InputStream,String,File相互转化
2012-05-14 23:32 12441. String --> InputStream ... -
转:实现类似手机QQ的可折叠固定标题列表
2012-04-12 19:05 1358http://douzifly.cnblog ... -
转:[Android]倒影效果的ImagView
2012-04-06 23:29 1343本文源自:http://blog.csdn.net/ke ... -
转:JDK中的URLConnection参数详解
2012-04-06 23:01 1145针对JDK中的URLConnection连 ... -
转:Game Engines for Android (Android游戏引擎)
2012-03-24 13:12 2687With Google IO fast approach ... -
做Android 系统/应用开发怎么可以不懂自动化测试
2012-03-22 15:02 1114http://blog.csdn.net/yiyaaixuex ... -
让Qt应用程序跑在Android上
2012-03-22 14:55 1315http://blog.c ... -
转:在android 2.3 AVD 模拟器上安装 google market 安卓市场
2012-03-22 14:29 1048http:// ... -
增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略
2012-03-22 14:26 1919... -
转:andengine中的ParticleSystem
2012-01-18 11:08 1495看ParticleSystemSimpleExample,看得 ... -
test4:腾讯
2011-12-26 20:27 2www.qq.com -
test3:Yahoo
2011-12-26 20:25 2www.yahoo.com -
test2:google
2011-12-26 10:53 5www.google.com.hk -
test1:百度
2011-12-26 10:52 6www.baidu.com -
转:android 打包自己的自定义组件成JAR包
2011-12-24 11:54 1246http://www.cnblogs.c ... -
转:AndEngine中的字体加载及应用
2011-12-15 15:39 1515AndEngine中的字体加载及应用 An ... -
转:Android游戏框架AndEngine使用入门
2011-12-13 14:24 1557项目站点:http://www.andengine.org 项 ... -
转:notification更新数字的显示及AnimationDrawable的结合使用
2011-12-07 10:25 2575这是本人加入博客园的首篇博文,自己平常在工作学习过程遇 ... -
转:Android系统上(mv不可用)cp命令的替代方法
2011-11-30 18:32 9631Android系统上cp命令 ...
相关推荐
Widget炫酷特效 (宏基扇子型效果).zip
QT界面的旋转切换样例,可以实现旋转效果,在切换不同显示内容时效果较好。
Widget特炫效果
Widget炫酷特效 (宏基扇子型效果)
一个界面可以有多个widget,通过不同的widget可以在一个界面上分别显示来自不同来源(网络服务)的信息。比如在blog的页面上通过多个widget同时显示自己在yupoo的相片、在饭否的言语、在last.fm记录的歌曲、豆瓣的...
一个界面可以有多个widget,通过不同的widget可以在一个界面上分别显示来自不同来源(网络服务)的信息。比如在blog的页面上通过多个widget同时显示自己在yupoo的相片、在饭否的言语、在last.fm记录的歌曲、豆瓣的...
一个界面可以有多个widget,通过不同的widget可以在一个界面上分别显示来自不同来源(网络服务)的信息。比如在blog的页面上通过多个widget同时显示自己在yupoo的相片、在饭否的言语、在last.fm记录的歌曲、豆瓣的...
本文主要介绍了桌面动态图库APP Widget设计过程。在设计之前,首先根据UI设计的原则,给出了合理的需求分析,确定了软件要实现的功能要求。然后根据功能要求,阐述了Widget的框架设计,包括桌面布局设计、实现Widget...
Widget
widget现状分析报告,分析当前widget的现状,并对运营商的widget提出建议
使用appWidget启动一个Activity
这是一个MP3程序,这个程序不仅仅带Activity,还有一个桌面Widget,同时是可以运行的源代码。可以通过桌面Widget控制后台音乐的播放,也可以点击Widget上面的LOGO进入应用程序。 涉及到了,一个基本的widget程序的大...
widget业务测试数据widget业务测试数据widget业务测试数据widget业务测试数据widget业务测试数据widget业务测试数据
绝对的好东西,点击Widget转换Widget的形态和Widget的状态
widget入门教程 android widget
widget开发的大不分资料和工具 还有开发必备的东西,要好好品尝啊!
Yahoo! Widget工具是由Yahoo!所推出的一款免费桌面应用程序平台,是一种运用了Javascript技术的开放源码平台,支持Windows和MacOS X...通过这些Widget工具,您可以连接雅虎的网络服务,取得您所需要的各种个性化信息。
SP Widget 软件使用手册 SP Widget 将提供 SILICON POWER 存储装置更多实用的软件功能,帮助您随时 能轻易地执行个人数据的备份加密。 有了 SP Widget,您将可使用 SILICON POWER 移动存储装置执行如下工作: 「我...
Android应用源码开发Demo,主要用于毕业设计学习。
制作widget的入门级别书目~可供参考~雅虎widget