android widget包说明与应用
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...不是很明白
一个完整的样例:
Xml代码 收藏代码
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="80dp"
android:minHeight="32dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/widget_provider"
android:configure="com.demo.widget.MyWidgetConfiguration" >
</appwidget-provider>
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:
Java代码 收藏代码
public class MyWidgetProvider extends AppWidgetProvider {
static final String TAG = "widget";
/**
* 更新
*/
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
Log.i(TAG, "onUpdate");
}
/**
* 第一个Widget组件启动时触发
*/
public void onEnabled(Context context){
Log.i(TAG, "onEnabled");
}
/**
* 最后一个Widget组件关闭时触发
*/
public void onDisabled(Context context){
Log.i(TAG, "onDisabled");
}
/**
* 任一Widget组件被删除时触发
*/
public void onDeleted(Context context, int[] appWidgetIds){
Log.i(TAG, "onDeleted");
}
/**
* 以上函数触发前会先触发该函数,一般不需要重写
*/
public void onReceive(Context context, Intent intent){
Log.i(TAG, "onReceive");
super.onReceive(context, intent);
}
}
其中onUpdate顾名思义是对Widget进行更新的,前面定义的更新周期就是作用于该函数的。
Widget的更新与Activity不同,必须借助于RemoteViews和AppWidgetMananger。具体实现如下:
Java代码 收藏代码
public void onUpdate(Context context, AppWidgetMananger appWidgetManager, int[] appWidgetIds){
int N = appWidgetIds.length; // 可能启动了多个Widget,appWidgetIds记录了这些Widget的ID
for(int i=0; i<N; i++){
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_views);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
}
其中需要注意的是,虽然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属性:
Xml代码 收藏代码
<receiver android:name="MyWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
</intent-filter>
<meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"></meta-data>
</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:
Java代码 收藏代码
int mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
否则会导致退出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>标识:
Xml代码 收藏代码
<meta-data android:resource="@xml/<属性文件xml>" android:name="android.appwidget.provider"></meta-data>
4. 创建Coniguration Activity(注意处理好setResult),添加到属性文件中的Configure属性,在manifest中注册activity,添加一个 action为android.appwidget.action.APPWIDGET_CONFIGURE 的IntentFilter
最后附上一个完整的例子,
实现思路如下:
1. 提供一个Configuration Activity,这里只简单显示一行文字;
2.退出后Widget启动;
3.点击Widget中的按钮会启动一个Activity
(转自:http://quding0308.iteye.com/blog/1164276)
android widget包说明与应用的更多相关文章
- android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...
- Android Widget(窗口小部件)
Android Widget简介 应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget Provide ...
- Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!
Android Widget小组件开发(一)--Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的! PS:学习自某网站(不打广告) 这个小组件相信大家都很熟悉吧,以前的墨迹天气 ...
- java.lang.ClassCastException android.widget.RelativeLayout LayoutParams 异常
1.在xml布局文件如下所示: <RelativeLayout android:layout_width="match_parent" android:layout_heig ...
- Android Java包各种功能简述
开发Android应用程序基本上使用的都是Java语言. 那么要想灵活的应用这一系统,就应当熟悉当中的Android Java包的各种功能. 一般的JAVA应用中.假设需用引用基础类库,通常须要使用例 ...
- Android通过包名打开第三方应用
import android.content.ComponentName; import android.content.Context; import android.content.Intent; ...
- Android导包导致java.lang.NoClassDefFoundError
摘要: SDK方法总数是不能超过65k的.是否也引入其他的三方库,导致总数超过限制.超出限制会导致部分class找不到,引发java.lang.NoClassDefFoundError.解决方法:近日 ...
- 关于java.lang.NoSuchMethodError: android.widget.RelativeLayout.setBackground的解决办法
今天用一个安卓4.0.4版本的手机测试手上的项目,发现logcat弹出这样一个提示“java.lang.NoSuchMethodError: android.widget.RelativeLayout ...
- 关于iOS和android自定义包的名字
自定义包名的使用,android的包名和ios的包名都是你的自定义包名!如下以新浪微博SDK自定义包名示例:(官方没的,自己踩过坑,方便后来人吧) 相关技术文档:http://www.apicloud ...
随机推荐
- C语言范例学习04
第三章 算法 前言:许多人对算法的看法是截然不同的,我之前提到过了.不过,我要说的还是那句话:算法体现编程思想,编程思想指引算法. 同时,有许多人认为简单算法都太简单了,应当去学习一些更为实用的复杂算 ...
- jquery $(document).ready() 与window.onload
- 初识Web 服务(即Web Service)
一.什么是Web服务 简单来说就是在Internet上提供的这种服务,我们称这种服务为Web服务. 二.Web服务的主要目标? 是支持跨平台的可互操作性. 三.Web服务的优势 四.Web服务提供了一 ...
- 类似 Dribbble 下载按钮的 SVG 弹性动画进度条
Codrops 发布了一个如何创建一个基于弹性效果的 SVG 加载进度条教程,基于 SVG 和 TweenMax 实现.按钮开始的时候是一个带有箭头的图标,一旦它被点击,动画成一个有趣的小金属丝和一个 ...
- 2013年最新流行的响应式 WordPress 主题【下篇】
在这篇文章中,我们收集了一些在2013年发布的最好的免费的响应式 WordPress 主题.这些主题包括高级功能,如自定义模板.自定义窗口小部件.自定义菜单主题选项等.让我们来看看下面的清单,并希望你 ...
- 【CSS3】css3:box-sizing属性
本文介绍了css3中的box-sizing属性,在这之前读者需要预备知识width的范围. 浏览器的支持情况 Browser Suppored Notes Internet Explorer Yes ...
- HTML5锚点请用id代替name
HTML5已经去掉name属性,实现锚点时请使用id,实例效果:http://keleyi.com/keleyi/phtml/html5/9.htm 支持Chrome,火狐,IE8以上等浏览器. 以下 ...
- 【经验之谈】前端面试知识点总结(HTML相关)——附答案
目录 一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 2.HTML5的优点与缺点? 3.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? 4.HTML5有哪些新 ...
- [deviceone开发]-土地销售App开源
一.简介 这个是一个真实项目改造开源,虽然不是很花哨,但是中规中矩,小细节处理的也很好,非常值得参考和借鉴.里面的数据都缓存到本地,可以离线运行,但是调整一下代码,马上就可以和服务端完全对接.后续会有 ...
- Maven版本与JDK版本
http://maven.apache.org/docs/history.html