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{
-
-
-
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);
-
}
-
}
-
}
-
-
-
-
-
-
-
-
-
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());
-
-
startActivityForResult(pickIntent,REQUEST_PICK_APPWIDGET);
-
returnfalse;
-
}
-
}</span>
请看效果图:

转载请注明出处:http://blog.csdn.net/tangcheng_ok/article/details/6857975
分享到:
相关推荐
Android AppWidget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件不需要用户启动应用,就能直接在主屏幕上显示和交互,为用户提供便捷的...
在Android开发中,Widget是应用在主屏幕上的小型UI组件,它们可以提供用户与应用程序的交互,无需打开应用本身。ListView是一种常用的布局管理器,它允许用户在一个滚动列表中显示大量数据。本教程将深入探讨如何在...
Android 桌面应用程序是 Android 操作系统中的一种应用程序,负责管理和显示桌面图标、快捷方式、widget 等元素。学习 Android 桌面应用程序开发,可以帮助开发者更好地理解 Android 操作系统的工作机制,掌握桌面...
在Android平台上,Widget是应用程序可以向用户主屏幕添加的小型交互式组件,它们提供了一种在主屏幕上展示信息和执行简单操作的方式。本主题聚焦于一个特定类型的Widget——时钟Widget,通过分析“android时钟widget...
在Android系统中,Launcher是用户界面的一个重要组成部分,它提供了应用程序的启动图标和小部件(Widgets)等元素,使得用户可以方便地访问和管理手机上的应用。本篇将深入探讨如何在自定义的Launcher中添加Widget,...
在Android平台上,Widget是应用程序的一种轻量级交互方式,它可以直接在用户的主屏幕上显示和操作,为用户提供便捷的功能入口。本示例中的“android的widget桌面开关例子”着重于创建一个能够在桌面上显示并控制2G和...
这个压缩包文件“安卓Widget小组件相关-AppWidge不用通过点击直接添加到应用程序中.rar”似乎包含了一些关于如何让Widget小组件不依赖用户点击就能直接添加到应用中的资源和代码示例。虽然描述中提到无法逐一验证...
最后,为了让用户能够添加你的App Widget到主屏幕,需要在应用程序的主活动中提供一个启动`AddWidgetActivity`的选项。`AddWidgetActivity`可以引导用户完成添加操作。 以上就是一个简单的Android音乐播放器App ...
Android AppWidget是Android系统提供的一种桌面小部件功能,允许开发者创建可以放置在用户主屏幕上的小型应用程序。这些小部件不需要用户直接启动,而是持续显示在屏幕上,为用户提供快速访问或控制应用的功能。在这...
在Android开发中,Widget是应用程序在用户主屏幕上的一种表现形式,它允许开发者为用户提供轻量级的交互体验,即便在应用程序未打开时也能提供服务。本篇将详细讲解"android widget"这一主题,主要基于 mars 老师的 ...
在Android平台上,AppWidget是Android系统提供的一种小部件功能,允许开发者创建可以在用户主屏幕上显示的小应用程序。AppWidgets虽然小巧,但能为用户提供便捷的功能访问,例如天气预报、音乐播放控制等。本教程将...
在Android平台上,Widget是应用程序的一种特殊形式,它们可以在用户的主屏幕上显示实时信息,提供快捷操作,无需打开完整的应用。这个“android 源码 android Widget开发案例 eclipse项目 直接导入”是一个很好的...
6. 添加到主屏幕:用户可以通过长按主屏幕,选择添加Widget来将你的应用Widget添加到设备上。 四、Widget的优化技巧 1. 使用RemoteViewsService:当Widget需要展示复杂或动态的数据时,可以创建一个...
Android小部件(Widget)是Android操作系统提供的一种特性,允许开发者创建可放置在用户主屏幕上的交互式迷你应用程序。这些小部件并非完整的应用,而是提供快速访问或操作应用程序核心功能的入口。在本教程中,我们...
在Android系统中,桌面Widget(App Widget)是应用程序在主屏幕上提供的一种小型用户界面,它允许用户无需打开应用即可快速访问或操作应用的功能。这个"Android的桌面Widget的Demo"显然是一个教学示例,用于展示如何...
在Android应用开发中,Widget小组件是用户界面的重要组成部分,它们允许用户在主屏幕上与应用程序进行交互,而无需打开实际的应用。本资料包"Android应用源码之android Widget小组件开发.zip"提供了一套完整的源代码...
在Android平台上,Widgets是应用程序的一种扩展,它们提供了无需打开应用就能与之交互的功能。在这个“android时钟widget例子”中,开发者创建了一个自定义的时钟组件,以满足对透明时钟的需求。 首先,我们需要...
它们可以显示实时信息,比如天气、时钟或者新闻摘要,而无需用户打开完整的应用程序。本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小...
Android小部件(Widget)是Android系统提供的一种桌面组件,它可以让用户在主屏幕上直接与应用程序进行交互,无需打开应用本身。本教程将详细介绍如何在Android项目中创建和使用一个简单的Widget。 1. **理解...