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

随手记下,有点儿乱,大家见谅