Widget添加方法:长安桌面-弹出Widget列表-选择之即添加到桌面,下面就实现了一个支持添加到自己应用程序的功能,废话不多说,直接上代码
1、通过继承ViewGroup来实现一个能添加Widget的控件
- <spanstyle="font-size:18px;">packagecn.winplus.w2h;
- importandroid.content.Context;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- publicclassWidgetLayoutextendsViewGroup{
- //存放touch的坐标
- privateint[]cellInfo=newint[2];
- privateOnLongClickListenermClickListener;
- publicWidgetLayout(Contextcontext){
- super(context);
- mClickListener=newOnLongClickListener(){
- @Override
- publicbooleanonLongClick(Viewarg0){
- returnfalse;
- }
- };
- }
- publicvoidaddInScreen(Viewchild,intwidth,intheight){
- LayoutParamslp=newLayoutParams(width,height);
- lp.x=cellInfo[0];
- lp.y=cellInfo[1];
- child.setOnLongClickListener(mClickListener);
- addView(child,lp);
- }
- @Override
- protectedvoidonLayout(booleanarg0,intarg1,intarg2,intarg3,intarg4){
- LayoutParamslParams;
- for(inti=0;i<getChildCount();i++){
- lParams=(LayoutParams)getChildAt(i).getLayoutParams();
- getChildAt(i).layout(lParams.x,lParams.y,
- lParams.x+lParams.width,lParams.y+lParams.height);
- }
- }
- @Override
- protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
- super.onMeasure(widthMeasureSpec,heightMeasureSpec);
- LayoutParamslParams;
- for(inti=0;i<getChildCount();i++){
- lParams=(LayoutParams)getChildAt(i).getLayoutParams();
- getChildAt(i).measure(
- MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY,lParams.width),
- MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY,lParams.height));
- }
- }
- @Override
- publicbooleandispatchTouchEvent(MotionEventev){
- cellInfo[0]=(int)ev.getX();
- cellInfo[1]=(int)ev.getY();
- returnsuper.dispatchTouchEvent(ev);
- }
- privateclassLayoutParamsextendsViewGroup.LayoutParams{
- intx;
- inty;
- publicLayoutParams(intarg0,intarg1){
- super(arg0,arg1);
- }
- }
- }</span>
2、实现添加Widget相关的操作
- <spanstyle="font-size:18px;">packagecn.winplus.w2h;
- importandroid.app.Activity;
- importandroid.appwidget.AppWidgetHost;
- importandroid.appwidget.AppWidgetManager;
- importandroid.appwidget.AppWidgetProviderInfo;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.view.View.OnLongClickListener;
- publicclassWidget2HomeActivityextendsActivityimplementsOnLongClickListener{
- privatestaticfinalStringTAG="Widget2HomeActivity";
- privateAppWidgetHostmAppWidgetHost;
- privateAppWidgetManagermAppWidgetManager;
- privateWidgetLayoutmWidgetLayout;
- privateContextcontext;
- privatestaticfinalintAPPWIDGET_HOST_ID=0x100;
- privatestaticfinalintREQUEST_PICK_APPWIDGET=0;
- privatestaticfinalintREQUEST_CREATE_APPWIDGET=1;
- privatestaticfinalStringEXTRA_CUSTOM_WIDGET="custom_widget";
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- context=getApplicationContext();
- mAppWidgetManager=AppWidgetManager.getInstance(context);
- mAppWidgetHost=newAppWidgetHost(context,APPWIDGET_HOST_ID);
- mAppWidgetHost.startListening();
- mWidgetLayout=newWidgetLayout(this);
- mWidgetLayout.setOnLongClickListener(this);
- setContentView(mWidgetLayout);
- }
- @Override
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
- super.onActivityResult(requestCode,resultCode,data);
- if(resultCode==RESULT_OK){
- switch(requestCode){
- caseREQUEST_PICK_APPWIDGET:
- addAppWidget(data);
- break;
- caseREQUEST_CREATE_APPWIDGET:
- completeAddAppWidget(data);
- break;
- }
- }elseif(requestCode==REQUEST_PICK_APPWIDGET
- &&resultCode==RESULT_CANCELED&&data!=null){
- intappWidgetId=data.getIntExtra(
- AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
- if(appWidgetId!=-1){
- mAppWidgetHost.deleteAppWidgetId(appWidgetId);
- }
- }
- }
- privatevoidaddAppWidget(Intentdata){
- intappWidgetId=data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
- StringcustomWidget=data.getStringExtra(EXTRA_CUSTOM_WIDGET);
- if("search_widget".equals(customWidget)){
- mAppWidgetHost.deleteAppWidgetId(appWidgetId);
- }else{
- AppWidgetProviderInfoappWidget=mAppWidgetManager
- .getAppWidgetInfo(appWidgetId);
- Log.d("addAppWidget","configure:"+appWidget.configure);
- if(appWidget.configure!=null){
- //弹出配置界面
- Intentintent=newIntent(
- AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
- intent.setComponent(appWidget.configure);
- intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
- appWidgetId);
- startActivityForResult(intent,REQUEST_CREATE_APPWIDGET);
- }else{
- //直接添加到界面
- onActivityResult(REQUEST_CREATE_APPWIDGET,Activity.RESULT_OK,
- data);
- }
- }
- }
- /**
- *添加widget
- *
- *@paramdata
- */
- privatevoidcompleteAddAppWidget(Intentdata){
- Bundleextras=data.getExtras();
- intappWidgetId=extras
- .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);
- AppWidgetProviderInfoappWidgetInfo=mAppWidgetManager
- .getAppWidgetInfo(appWidgetId);
- ViewhostView=mAppWidgetHost.createView(this,appWidgetId,
- appWidgetInfo);
- mWidgetLayout.addInScreen(hostView,appWidgetInfo.minWidth,
- appWidgetInfo.minHeight);
- }
- @Override
- protectedvoidonDestroy(){
- try{
- mAppWidgetHost.stopListening();
- }catch(NullPointerExceptionex){
- Log.i(TAG,"problemwhilestoppingAppWidgetHostduringLauncherdestruction",ex);
- }
- super.onDestroy();
- }
- @Override
- publicbooleanonLongClick(Viewv){
- IntentpickIntent=newIntent(AppWidgetManager.ACTION_APPWIDGET_PICK);
- pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,mAppWidgetHost.allocateAppWidgetId());
- //startthepickactivity
- startActivityForResult(pickIntent,REQUEST_PICK_APPWIDGET);
- returnfalse;
- }
- }</span>
请看效果图: