注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

海天鹰

在大海和天空中翱翔,用锐利的目光审视着这个世界

 
 
 

日志

 
 

【转载】android widget 小结  

2014-05-27 10:36:02|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载自夏天的风《android widget 小结》
 

 1、为widget添加点击事件

      在继承自AppWidgetProvider类的onUpdate方法中添加监听并发送点击事件:

 

   设置Intent,用intent来发送消息 ,对于不同的事件响应,我们可以用不同的intent来传递消息(调用Intent的setAction(int )方法,然后再接收到消息的时候,调用Intent的getAction(),然后对action进行判断来决定是哪个发送的时间) 

 

//这里构造intent的时候,就添加了Intent的action标识 "com.zwq.taskMan"

       Intent  actClick=new Intent("com.zwq.taskMan");

// PendingIntent  相当于一个包裹着intent的东西,当PendingIntent打开,就可以看到intent,intent就启动了

       PendingIntent  pending= PendingIntent.getBroadcast(context, 0, actClick, 0);

//通过包名和布局文件获得RemoteViews

       RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget);

//哪个控件发送这个消息

       rv.setOnClickPendingIntent(R.id.kill_all_image, pending);

 //更新这个View

      appWidgetManager.updateAppWidget(appWidgetIds, rv);

 

 还必须在AndroidManifest.xml的receiver中添加相应的动作,(因为widget的消息是通过广播来通知的)

<action android:name="com.zwq.taskMan"></action>

 

这样就可以在onReceive方法中通过

if ("com.zwq.taskMan".equals(intent.getAction())) {

    ///过滤到发送的监听事件了,在这儿可以做相应的事件处理。

}

 

 

2、点击widget时启动一个Activity:

 

  // Push newly updated widget to surface,PhotoAppWidgetProvider继承了AppwidgetProvider类

RemoteViews views = PhotoAppWidgetProvider.buildUpdate(this,mAppWidgetId, helper);

                           

//     Intent  actionIntent=new Intent(INTENT_FLAG);

//     PendingIntent pending= PendingIntent.getBroadcast(this, 0, actionIntent, 0);

 

//PhotoAppWidgetConfigure是继承了activity的类,Photo.class是要跳转到的activity类

       Intent actionIntent = new Intent(PhotoAppWidgetConfigure.this, Photo.class);

       PendingIntent pending = PendingIntent.getActivity(this, 0, actionIntent, 0);

       views.setOnClickPendingIntent(R.id.photo, pending);

 

可以将这个Widget的id传递给该Activity:

Bundle value = new Bundle();

value.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);

actionIntent.putExtras(value);

 

一个程序显示多个Widget,如果程序需要显示不同尺寸的widget,可以配置多个widget,具体就是要有多个provider,然后在androidmenifist里面配置多个receive

<receiver android:name=".PhotoProviderTwo" android:label="two">

            <meta-data android:name="android.appwidget.provider"

                    android:resource="@xml/appwidget_info_two"/>

            <intent-filter>

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

            </intent-filter>

        </receiver>

       

        <receiver android:name=".PhotoProviderThree" android:label="three">

            <meta-data android:name="android.appwidget.provider"

                    android:resource="@xml/appwidget_info_three"/>

            <intent-filter>

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

            </intent-filter>

        </receiver>

       

        <receiver android:name=".PhotoProviderFour" android:label="four">

            <meta-data android:name="android.appwidget.provider"

                    android:resource="@xml/appwidget_info_four"/>

            <intent-filter>

                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

            </intent-filter>

        </receiver>

 

 

更新Widget的图片:

只要在AppWidgetProvider的onReceive方法里面写上更新的代码即可:

        public void onReceive(Context context, Intent intent) {

              if (intent.getAction().equals(Common.WIDGET_UPDATE_PHOTO)) {

                     Bundle b=intent.getExtras();

                     String path=b.getString(Common.CURRENT_PHOTO_PATH);

                     RemoteViews views = new RemoteViews(context.getPackageName(),

                                   R.layout.photo_frame);

                     BitmapTool get = new BitmapTool();

                     Bitmap bitmap = get.getBitmap(path);

                     bitmap = Bitmap.createBitmap(bitmap);

                     views.setImageViewBitmap(R.id.widget_photo, bitmap);

                     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

                     appWidgetManager.updateAppWidget(new ComponentName(context,PhotoProviderThree.class), views);

              }

              super.onReceive(context, intent);

       }

 

特别注意:

当使用

views.setImageViewResource(R.id.widget_photo, R.drawable.background);

更新时,没什么问题,View里面的图片可以完全更新,这样图片只能来自程序本身自带的。如果需要使用程序以外的图片就要用到:

views.setImageViewBitmap(R.id.widget_photo, bitmap);

 

 

这是要注意添加:

bitmap = Bitmap.createBitmap(bitmap);

不然图片是不会更新的。还有就是图片不能太大,如果太大也是不能更新的!

具体问题参考老外的文章:http://code.google.com/p/android/issues/detail?id=8489

http://eyes-free.googlecode.com/svn/trunk/androidsays/src/com/google/marvin/androidsays/WidgetInterface.java

 

五、Widget不错的参考资料:

http://hi.baidu.com/tdskee/blog/item/3459249b3a6da1a1c9eaf4bc.html

http://hi.baidu.com/tdskee/blog/item/575bbcaf758559d87cd92abe.html

 

 

 

 

 

  评论这张
 
阅读(58)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018