android widget 多按钮点击,图片刷新等问题
来源:互联网 发布:js禁止浏览器滚动条 编辑:程序博客网 时间:2024/06/05 23:42
前段时间做一个小项目,是一个桌面小部件widget,由于之前没有接触过,所以各种查资料,现在记录下来一些东西,希望可以帮助初学者。
首先widget的创建,绑定activity都很简单,网上有现成的例子,这里不再赘述。
1.多按钮监听
在widget中监听一个button或者其他组件很简单:
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.test_layout);
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, 0);
rv.setOnClickPendingIntent(R.id.btn, pendingIntent);
多个按钮的监听就是下面这样
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.test_layout);
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intent, 0);
rv.setOnClickPendingIntent(R.id.btn, pendingIntent);
Intent intent1 = new Intent(context, MainActivity.class);
PendingIntent pendingIntent1 = PendingIntent.getActivity(context, 0,
intent1, 0);
rv.setOnClickPendingIntent(R.id.btn1, pendingIntent1);
这样的话,如果有很多个按钮肯定很麻烦。
下面是我的做法。
Intent intentClick = new Intent(action);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
intentClick, 0);
rv.setOnClickPendingIntent(btnId, pendingIntent);
其中action是自定义的一个广播,每个按钮对应一个广播(按钮太多的话就动态注册),然后在广播的receive中接收并进行相应的操作。
btnId我们可以用反射的方法来获取组件ID,把这个放在for循环中,设置多个按钮的点击事件监听。
2.刷新与点击事件
public void onReceive(Context context, Intent intent)
{
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
// 更新组件上面的数据
}
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
// 设置按钮的监听事件
}
在receive和update中都new一个RemoteViews,这样就会存在一个问题,我在update中设置的监听事件就没有效果了。
最后没办法,就只能在更新数据的时候再设置一下按钮的监听事件。
网上也有另一种办法,就是在receive中不再new一个RemoteViews,而是把update中的设成全局的,但是这样就引起了一个死机问题,具体可以看下面的 4.遇到的死机问题
3.图片的刷新
widget中有rv.setImageViewUri(viewId, uri)这个函数去设置imageview的图标,但是却告诉我不能在主线程里面联网,不知道这个方法具体是让怎么用的,所以只能是自己写了一个下载图片的方法,然后下载完成后,通知界面刷新。
4.遇到的死机问题
java.lang.RuntimeException: Unable to start receiver com.xxx.xxx: java.lang.RuntimeException: system server dead?
Caused by: android.os.TransactionTooLargeException
在2.中我设置RemoteViews为全局的,然后在程序运行大概半小时左右(已经刷新了好多次)就出现了这样的异常,最后解决办法就是在receive中重新new了一个,然后重新设置了监听事件
5.关于复杂布局
做之前我们的设计是要求widget中放一个webview,然后设定时间去更新,但是查过资料发现,RemoteViews中不支持复杂布局,如果要支持webview listview等复杂布局,貌似只能改源码了,具体没有去尝试,具体参考http://blog.csdn.net/hmg25/article/details/6574600
随手记下,有点儿乱,大家见谅
- android widget 多按钮点击,图片刷新等问题
- 关于点击按钮刷新问题
- android widget无法点击问题
- [Android widget] Android 点击图标重新启动问题
- android 点击按钮更换图片
- HTML/Javascript: 点击按钮页面刷新问题
- Android图片点击放大等
- flex 点击按钮加载本地图片问题
- WebUploader 选择图片按钮点击无效问题
- Android Widget点击事件
- Android Widget点击事件
- Android Widget点击事件
- Android ImageSwitcher 图片切换 按钮点击切换
- Android中图片实现按钮点击效果
- Android 图片实现按钮点击切换效果
- Android 点击按钮上下翻页图片
- Android 图片实现按钮点击切换效果
- Android设置点击可变图片按钮
- uva 11549 - Calculator Conundrum (Floyd判圈法)
- cacti气象图调整(批量位置调整、更改生成图大小等)
- C++ map的基本操作和使用
- WdatePicker.js
- iPad/iPhone设备的系统常用文件夹的位置以及说明
- android widget 多按钮点击,图片刷新等问题
- MATLAB2维小波变换经典程序
- hibernate+proxool的数据库连接池配置方法
- 命题逻辑中的语法与语义,可靠性与完备性
- 九宫问题(八数码问题)的解法
- 第一个字符串指针
- 追MM 之 Java 23种设计模式
- iPad/Iphone抓包
- tcpdump 网络数据包分析工具