`

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 appwidget使用说明及示例程序

    Android AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件不需要用户启动应用,就能直接在主屏幕上显示和交互,为用户提供便捷的...

    Android的widget使用listview布局

    在Android开发中,Widget是应用在主屏幕上的小型UI组件,它们可以提供用户与应用程序的交互,无需打开应用本身。ListView是一种常用的布局管理器,它允许用户在一个滚动列表中显示大量数据。本教程将深入探讨如何在...

    android桌面应用程序

    Android 桌面应用程序是 Android 操作系统中的一种应用程序,负责管理和显示桌面图标、快捷方式、widget 等元素。学习 Android 桌面应用程序开发,可以帮助开发者更好地理解 Android 操作系统的工作机制,掌握桌面...

    android时钟widget小部件源代码

    在Android平台上,Widget是应用程序可以向用户主屏幕添加的小型交互式组件,它们提供了一种在主屏幕上展示信息和执行简单操作的方式。本主题聚焦于一个特定类型的Widget——时钟Widget,通过分析“android时钟widget...

    android Launcher添加widget源码

    在Android系统中,Launcher是用户界面的一个重要组成部分,它提供了应用程序的启动图标和小部件(Widgets)等元素,使得用户可以方便地访问和管理手机上的应用。本篇将深入探讨如何在自定义的Launcher中添加Widget,...

    android的widget桌面开关例子

    在Android平台上,Widget是应用程序的一种轻量级交互方式,它可以直接在用户的主屏幕上显示和操作,为用户提供便捷的功能入口。本示例中的“android的widget桌面开关例子”着重于创建一个能够在桌面上显示并控制2G和...

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

    这个压缩包文件“安卓Widget小组件相关-AppWidge不用通过点击直接添加到应用程序中.rar”似乎包含了一些关于如何让Widget小组件不依赖用户点击就能直接添加到应用中的资源和代码示例。虽然描述中提到无法逐一验证...

    Android App Widget 开发

    最后,为了让用户能够添加你的App Widget到主屏幕,需要在应用程序的主活动中提供一个启动`AddWidgetActivity`的选项。`AddWidgetActivity`可以引导用户完成添加操作。 以上就是一个简单的Android音乐播放器App ...

    android appwidget 经典完整代码

    Android AppWidget是Android系统提供的一种桌面小部件功能,允许开发者创建可以放置在用户主屏幕上的小型应用程序。这些小部件不需要用户直接启动,而是持续显示在屏幕上,为用户提供快速访问或控制应用的功能。在这...

    android widget

    在Android开发中,Widget是应用程序在用户主屏幕上的一种表现形式,它允许开发者为用户提供轻量级的交互体验,即便在应用程序未打开时也能提供服务。本篇将详细讲解"android widget"这一主题,主要基于 mars 老师的 ...

    Android AppWidget实例验证

    在Android平台上,AppWidget是Android系统提供的一种小部件功能,允许开发者创建可以在用户主屏幕上显示的小应用程序。AppWidgets虽然小巧,但能为用户提供便捷的功能访问,例如天气预报、音乐播放控制等。本教程将...

    android 源码 android Widget开发案例 eclipse项目 直接导入

    在Android平台上,Widget是应用程序的一种特殊形式,它们可以在用户的主屏幕上显示实时信息,提供快捷操作,无需打开完整的应用。这个“android 源码 android Widget开发案例 eclipse项目 直接导入”是一个很好的...

    Android高级应用源码-android Widget小组件开发.rar

    6. 添加到主屏幕:用户可以通过长按主屏幕,选择添加Widget来将你的应用Widget添加到设备上。 四、Widget的优化技巧 1. 使用RemoteViewsService:当Widget需要展示复杂或动态的数据时,可以创建一个...

    android Widget

    Android小部件(Widget)是Android操作系统提供的一种特性,允许开发者创建可放置在用户主屏幕上的交互式迷你应用程序。这些小部件并非完整的应用,而是提供快速访问或操作应用程序核心功能的入口。在本教程中,我们...

    Android的桌面Widget的Demo

    在Android系统中,桌面Widget(App Widget)是应用程序在主屏幕上提供的一种小型用户界面,它允许用户无需打开应用即可快速访问或操作应用的功能。这个"Android的桌面Widget的Demo"显然是一个教学示例,用于展示如何...

    Android应用源码之android Widget小组件开发.zip

    在Android应用开发中,Widget小组件是用户界面的重要组成部分,它们允许用户在主屏幕上与应用程序进行交互,而无需打开实际的应用。本资料包"Android应用源码之android Widget小组件开发.zip"提供了一套完整的源代码...

    android时钟widget例子

    在Android平台上,Widgets是应用程序的一种扩展,它们提供了无需打开应用就能与之交互的功能。在这个“android时钟widget例子”中,开发者创建了一个自定义的时钟组件,以满足对透明时钟的需求。 首先,我们需要...

    安卓Widget小组件相关-androidWidget小组件开发.zip

    它们可以显示实时信息,比如天气、时钟或者新闻摘要,而无需用户打开完整的应用程序。本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小...

    android widget简单使用方法

    Android小部件(Widget)是Android系统提供的一种桌面组件,它可以让用户在主屏幕上直接与应用程序进行交互,无需打开应用本身。本教程将详细介绍如何在Android项目中创建和使用一个简单的Widget。 1. **理解...

Global site tag (gtag.js) - Google Analytics