`

Android将Widget添加到自己的应用程序

 
阅读更多

Widget添加方法:长安桌面-弹出Widget列表-选择之即添加到桌面,下面就实现了一个支持添加到自己应用程序的功能,废话不多说,直接上代码

1、通过继承ViewGroup来实现一个能添加Widget的控件

  1. <spanstyle="font-size:18px;">packagecn.winplus.w2h;
  2. importandroid.content.Context;
  3. importandroid.view.MotionEvent;
  4. importandroid.view.View;
  5. importandroid.view.ViewGroup;
  6. publicclassWidgetLayoutextendsViewGroup{
  7. //存放touch的坐标
  8. privateint[]cellInfo=newint[2];
  9. privateOnLongClickListenermClickListener;
  10. publicWidgetLayout(Contextcontext){
  11. super(context);
  12. mClickListener=newOnLongClickListener(){
  13. @Override
  14. publicbooleanonLongClick(Viewarg0){
  15. returnfalse;
  16. }
  17. };
  18. }
  19. publicvoidaddInScreen(Viewchild,intwidth,intheight){
  20. LayoutParamslp=newLayoutParams(width,height);
  21. lp.x=cellInfo[0];
  22. lp.y=cellInfo[1];
  23. child.setOnLongClickListener(mClickListener);
  24. addView(child,lp);
  25. }
  26. @Override
  27. protectedvoidonLayout(booleanarg0,intarg1,intarg2,intarg3,intarg4){
  28. LayoutParamslParams;
  29. for(inti=0;i<getChildCount();i++){
  30. lParams=(LayoutParams)getChildAt(i).getLayoutParams();
  31. getChildAt(i).layout(lParams.x,lParams.y,
  32. lParams.x+lParams.width,lParams.y+lParams.height);
  33. }
  34. }
  35. @Override
  36. protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
  37. super.onMeasure(widthMeasureSpec,heightMeasureSpec);
  38. LayoutParamslParams;
  39. for(inti=0;i<getChildCount();i++){
  40. lParams=(LayoutParams)getChildAt(i).getLayoutParams();
  41. getChildAt(i).measure(
  42. MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY,lParams.width),
  43. MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY,lParams.height));
  44. }
  45. }
  46. @Override
  47. publicbooleandispatchTouchEvent(MotionEventev){
  48. cellInfo[0]=(int)ev.getX();
  49. cellInfo[1]=(int)ev.getY();
  50. returnsuper.dispatchTouchEvent(ev);
  51. }
  52. privateclassLayoutParamsextendsViewGroup.LayoutParams{
  53. intx;
  54. inty;
  55. publicLayoutParams(intarg0,intarg1){
  56. super(arg0,arg1);
  57. }
  58. }
  59. }</span>

2、实现添加Widget相关的操作

  1. <spanstyle="font-size:18px;">packagecn.winplus.w2h;
  2. importandroid.app.Activity;
  3. importandroid.appwidget.AppWidgetHost;
  4. importandroid.appwidget.AppWidgetManager;
  5. importandroid.appwidget.AppWidgetProviderInfo;
  6. importandroid.content.Context;
  7. importandroid.content.Intent;
  8. importandroid.os.Bundle;
  9. importandroid.util.Log;
  10. importandroid.view.View;
  11. importandroid.view.View.OnLongClickListener;
  12. publicclassWidget2HomeActivityextendsActivityimplementsOnLongClickListener{
  13. privatestaticfinalStringTAG="Widget2HomeActivity";
  14. privateAppWidgetHostmAppWidgetHost;
  15. privateAppWidgetManagermAppWidgetManager;
  16. privateWidgetLayoutmWidgetLayout;
  17. privateContextcontext;
  18. privatestaticfinalintAPPWIDGET_HOST_ID=0x100;
  19. privatestaticfinalintREQUEST_PICK_APPWIDGET=0;
  20. privatestaticfinalintREQUEST_CREATE_APPWIDGET=1;
  21. privatestaticfinalStringEXTRA_CUSTOM_WIDGET="custom_widget";
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. context=getApplicationContext();
  26. mAppWidgetManager=AppWidgetManager.getInstance(context);
  27. mAppWidgetHost=newAppWidgetHost(context,APPWIDGET_HOST_ID);
  28. mAppWidgetHost.startListening();
  29. mWidgetLayout=newWidgetLayout(this);
  30. mWidgetLayout.setOnLongClickListener(this);
  31. setContentView(mWidgetLayout);
  32. }
  33. @Override
  34. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  35. super.onActivityResult(requestCode,resultCode,data);
  36. if(resultCode==RESULT_OK){
  37. switch(requestCode){
  38. caseREQUEST_PICK_APPWIDGET:
  39. addAppWidget(data);
  40. break;
  41. caseREQUEST_CREATE_APPWIDGET:
  42. completeAddAppWidget(data);
  43. break;
  44. }
  45. }elseif(requestCode==REQUEST_PICK_APPWIDGET
  46. &&resultCode==RESULT_CANCELED&&data!=null){
  47. intappWidgetId=data.getIntExtra(
  48. AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
  49. if(appWidgetId!=-1){
  50. mAppWidgetHost.deleteAppWidgetId(appWidgetId);
  51. }
  52. }
  53. }
  54. privatevoidaddAppWidget(Intentdata){
  55. intappWidgetId=data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
  56. StringcustomWidget=data.getStringExtra(EXTRA_CUSTOM_WIDGET);
  57. if("search_widget".equals(customWidget)){
  58. mAppWidgetHost.deleteAppWidgetId(appWidgetId);
  59. }else{
  60. AppWidgetProviderInfoappWidget=mAppWidgetManager
  61. .getAppWidgetInfo(appWidgetId);
  62. Log.d("addAppWidget","configure:"+appWidget.configure);
  63. if(appWidget.configure!=null){
  64. //弹出配置界面
  65. Intentintent=newIntent(
  66. AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
  67. intent.setComponent(appWidget.configure);
  68. intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
  69. appWidgetId);
  70. startActivityForResult(intent,REQUEST_CREATE_APPWIDGET);
  71. }else{
  72. //直接添加到界面
  73. onActivityResult(REQUEST_CREATE_APPWIDGET,Activity.RESULT_OK,
  74. data);
  75. }
  76. }
  77. }
  78. /**
  79. *添加widget
  80. *
  81. *@paramdata
  82. */
  83. privatevoidcompleteAddAppWidget(Intentdata){
  84. Bundleextras=data.getExtras();
  85. intappWidgetId=extras
  86. .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
  87. AppWidgetProviderInfoappWidgetInfo=mAppWidgetManager
  88. .getAppWidgetInfo(appWidgetId);
  89. ViewhostView=mAppWidgetHost.createView(this,appWidgetId,
  90. appWidgetInfo);
  91. mWidgetLayout.addInScreen(hostView,appWidgetInfo.minWidth,
  92. appWidgetInfo.minHeight);
  93. }
  94. @Override
  95. protectedvoidonDestroy(){
  96. try{
  97. mAppWidgetHost.stopListening();
  98. }catch(NullPointerExceptionex){
  99. Log.i(TAG,"problemwhilestoppingAppWidgetHostduringLauncherdestruction",ex);
  100. }
  101. super.onDestroy();
  102. }
  103. @Override
  104. publicbooleanonLongClick(Viewv){
  105. IntentpickIntent=newIntent(AppWidgetManager.ACTION_APPWIDGET_PICK);
  106. pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,mAppWidgetHost.allocateAppWidgetId());
  107. //startthepickactivity
  108. startActivityForResult(pickIntent,REQUEST_PICK_APPWIDGET);
  109. returnfalse;
  110. }
  111. }</span>

请看效果图:

转载请注明出处:http://blog.csdn.net/tangcheng_ok/article/details/6857975
分享到:
评论

相关推荐

    Android天气预报widget的设计与实现毕业论文

    3.2 ANDROID应用程序组成 12 3.2.1 Avtivity介绍 12 3.2.2 Broadcast Intent Receiver介绍 13 3.2.3 Service介绍 14 3.2.4 Content Provider介绍 14 3.2.5 Intent介绍 15 3.3 ANDROID应用程序工程文件 17 第4章 天气...

    Widget2Home

    将Widget添加到自己的应用程序,Android

    安卓Widget小组件相关-AppWidge不用通过点击直接添加到应用程序中.rar

    AppWidge不用通过点击,直接添加到应用程序中.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android应用开发程序

    教程名称: Android 应用开发程序源码【】10个实用Android应用程序源码【】7个Android应用程序源代码【】andriod闹钟源代码【】android 365手机秘书源代码【】Android 个人记账程序源码【】Android 天气提醒程序...

    android appwidget测试

    Appwidget就是手机应用中常常放在桌面(即home)上的一些应用程序,比如说闹钟等。这种应用程序的特点是它上面显示的内容能够根据系统内部的数据进行更新,不需要我们进入到程序的内部去,比如说闹钟指针的摆动等。本...

    Android高级编程--源代码

     本书将指导你使用Androidl.0软件开发包来构建移动应用程序。在每章的讲解中,它会让你通过一系列示例项目逐步掌握Android中的各种新功能和技术,助你取得最圆满的学习效果。本书所介绍的各个应用实例简明扼要且极...

    AppWidget窗口小部件

    不用通过点击,直接添加到应用程序中

    新版Android开发教程.rar

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...

    《Android高级编程》

    6.2 保存简单的应用程序数据 6.2.1 创建和保存preference 6.2.2 检索共享的preference 6.2.3 保存活动状态 6.2.4 为地震查看器创建一个Preference页 6.3 保存和载入文件 6.3.1 将静态文件作为资源添加 6.3.2 文件...

    TransLoc-Android-Widget:用于TransLoc总线跟踪的Android小部件应用程序

    一个简单的Android小部件应用程序,用于在Android主屏幕上查看公交车的到站时间。 使用 我决定将其开源,因为在开发Android小部件方面非常缺乏Android文档和在线教程。 该来源可能对以下内容有帮助... 带有...

    ChatView:这是一个Android库,只需几行代码即可将聊天功能添加到您的android应用程序中

    这是一个Android库,只需几行代码即可将聊天功能添加到您的android应用程序中。 该库仍处于测试阶段,但会随着时间的推移进行改进。 版 安装 将其添加到存储库末尾的root build.gradle中: allprojects { ...

    android开发资料大全

    命令行开发、编译、打包Android应用程序汇总大全 Android 动画效果二 Frame Animation 动画专题研究 Android新浪客户端开发教程(完整版)汇总大全 Android多媒体实例大汇集(源码,全) Android中利用画图类和线程...

    Android高级编程 part1

    Android高级编程《Android高级编程》有清华大学出版社出版,书中对Android做了简单介绍,并对创建应用程序,用户见面编程做了介绍。并对一些新功能。如:地图,P2P通信,蓝牙以及后台和用Android访问硬件,分章节做...

    Android高级编程 part2

    Android高级编程《Android高级编程》有清华大学出版社出版,书中对Android做了简单介绍,并对创建应用程序,用户见面编程做了介绍。并对一些新功能。如:地图,P2P通信,蓝牙以及后台和用Android访问硬件,分章节做...

    《Google Android SDK开发范例大全(第3版)》.pdf

    2.5 部署应用程序到android手机 19 第3章 用户人机界面 22 3.1 更改与显示文字标签 23 3.2 更改手机窗口画面底色 24 3.3 更改textview文字颜色 26 3.4 置换textview文字 28 3.5 取得手机屏幕大小...

    Android高级编程.pdf

    1.4 自带的Android应用程序 1.5 Android SDK功能 1.5.1 对包括摄像头、GPS和加速计在内的硬件的访问 1.5.2 自带的Google地图、地理编码和基于位置的服务 1.5.3 后台服务 1.5.4 SQLite数据存储和检索数据库 1.5.5 ...

    Android基础教程

    以及本地数据存储等基础知识,而且通过“Hello, Android”项目深入探讨了外部通信、基于位置的服务、内置SQLite数据库、3D图形、多点触控、小部件、兼容性测试,以及如何向AndroidMarket发布应用程序等内容。...

    Google Android SDK开发范例大全(第3版) 1/5

    2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签 3.2 更改手机窗口画面底色 3.3 更改TextView文字颜色 3.4 置换TextView文字 3.5 取得手机屏幕大小 3.6 样式化的定型对象 3.7 简易的按钮...

Global site tag (gtag.js) - Google Analytics