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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值