Android将Widget添加到自己的应用程序
2011-10-29 01:15
375 查看
Widget添加方法:长安桌面-弹出Widget列表-选择之即添加到桌面,下面就实现了一个支持添加到自己应用程序的功能,废话不多说,直接上代码
to clipboardprint?
<span style="font-size:18px;">package cn.winplus.w2h;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
public class WidgetLayout extends ViewGroup {
// 存放touch的坐标
private int[] cellInfo = new int[2];
private OnLongClickListener mClickListener;
public WidgetLayout(Context context) {
super(context);
mClickListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
return false;
}
};
}
public void addInScreen(View child, int width, int height) {
LayoutParams lp = new LayoutParams(width, height);
lp.x = cellInfo[0];
lp.y = cellInfo[1];
child.setOnLongClickListener(mClickListener);
addView(child, lp);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
LayoutParams lParams;
for (int i = 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
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
LayoutParams lParams;
for (int i = 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
public boolean dispatchTouchEvent(MotionEvent ev) {
cellInfo[0] = (int) ev.getX();
cellInfo[1] = (int) ev.getY();
return super.dispatchTouchEvent(ev);
}
private class LayoutParams extends ViewGroup.LayoutParams {
int x;
int y;
public LayoutParams(int arg0, int arg1) {
super(arg0, arg1);
}
}
}</span>
请看效果图:
转载请注明出处:/article/1411300.html
1、通过继承ViewGroup来实现一个能添加Widget的控件
view plaincopyto clipboardprint?
<span style="font-size:18px;">package cn.winplus.w2h;
import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
public class WidgetLayout extends ViewGroup {
// 存放touch的坐标
private int[] cellInfo = new int[2];
private OnLongClickListener mClickListener;
public WidgetLayout(Context context) {
super(context);
mClickListener = new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
return false;
}
};
}
public void addInScreen(View child, int width, int height) {
LayoutParams lp = new LayoutParams(width, height);
lp.x = cellInfo[0];
lp.y = cellInfo[1];
child.setOnLongClickListener(mClickListener);
addView(child, lp);
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
LayoutParams lParams;
for (int i = 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
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
LayoutParams lParams;
for (int i = 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
public boolean dispatchTouchEvent(MotionEvent ev) {
cellInfo[0] = (int) ev.getX();
cellInfo[1] = (int) ev.getY();
return super.dispatchTouchEvent(ev);
}
private class LayoutParams extends ViewGroup.LayoutParams {
int x;
int y;
public LayoutParams(int arg0, int arg1) {
super(arg0, arg1);
}
}
}</span>
view plaincopy to clipboardprint? <span style="font-size:18px;">package cn.winplus.w2h; import android.app.Activity; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnLongClickListener; public class Widget2HomeActivity extends Activity implements OnLongClickListener{ private static final String TAG = "Widget2HomeActivity"; private AppWidgetHost mAppWidgetHost; private AppWidgetManager mAppWidgetManager; private WidgetLayout mWidgetLayout; private Context context; private static final int APPWIDGET_HOST_ID = 0x100; private static final int REQUEST_PICK_APPWIDGET = 0; private static final int REQUEST_CREATE_APPWIDGET = 1; private static final String EXTRA_CUSTOM_WIDGET = "custom_widget"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getApplicationContext(); mAppWidgetManager = AppWidgetManager.getInstance(context); mAppWidgetHost = new AppWidgetHost(context, APPWIDGET_HOST_ID); mAppWidgetHost.startListening(); mWidgetLayout = new WidgetLayout(this); mWidgetLayout.setOnLongClickListener(this); setContentView(mWidgetLayout); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case REQUEST_PICK_APPWIDGET: addAppWidget(data); break; case REQUEST_CREATE_APPWIDGET: completeAddAppWidget(data); break; } } else if (requestCode == REQUEST_PICK_APPWIDGET && resultCode == RESULT_CANCELED && data != null) { int appWidgetId = data.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, -1); if (appWidgetId != -1) { mAppWidgetHost.deleteAppWidgetId(appWidgetId); } } } private void addAppWidget(Intent data) { int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1); String customWidget = data.getStringExtra(EXTRA_CUSTOM_WIDGET); if ("search_widget".equals(customWidget)) { mAppWidgetHost.deleteAppWidgetId(appWidgetId); } else { AppWidgetProviderInfo appWidget = mAppWidgetManager .getAppWidgetInfo(appWidgetId); Log.d("addAppWidget", "configure:" + appWidget.configure); if (appWidget.configure != null) { // 弹出配置界面 Intent intent = new Intent( 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 * * @param data */ private void completeAddAppWidget(Intent data) { Bundle extras = data.getExtras(); int appWidgetId = extras .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager .getAppWidgetInfo(appWidgetId); View hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); mWidgetLayout.addInScreen(hostView, appWidgetInfo.minWidth, appWidgetInfo.minHeight); } @Override protected void onDestroy() { try { mAppWidgetHost.stopListening(); } catch (NullPointerException ex) { Log.i(TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex); } super.onDestroy(); } @Override public boolean onLongClick(View v) { Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetHost.allocateAppWidgetId()); // start the pick activity startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET); return false; } }</span> <span style="font-size:18px;">package cn.winplus.w2h; import android.app.Activity; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnLongClickListener; public class Widget2HomeActivity extends Activity implements OnLongClickListener{ private static final String TAG = "Widget2HomeActivity"; private AppWidgetHost mAppWidgetHost; private AppWidgetManager mAppWidgetManager; private WidgetLayout mWidgetLayout; private Context context; private static final int APPWIDGET_HOST_ID = 0x100; private static final int REQUEST_PICK_APPWIDGET = 0; private static final int REQUEST_CREATE_APPWIDGET = 1; private static final String EXTRA_CUSTOM_WIDGET = "custom_widget"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getApplicationContext(); mAppWidgetManager = AppWidgetManager.getInstance(context); mAppWidgetHost = new AppWidgetHost(context, APPWIDGET_HOST_ID); mAppWidgetHost.startListening(); mWidgetLayout = new WidgetLayout(this); mWidgetLayout.setOnLongClickListener(this); setContentView(mWidgetLayout); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case REQUEST_PICK_APPWIDGET: addAppWidget(data); break; case REQUEST_CREATE_APPWIDGET: completeAddAppWidget(data); break; } } else if (requestCode == REQUEST_PICK_APPWIDGET && resultCode == RESULT_CANCELED && data != null) { int appWidgetId = data.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, -1); if (appWidgetId != -1) { mAppWidgetHost.deleteAppWidgetId(appWidgetId); } } } private void addAppWidget(Intent data) { int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1); String customWidget = data.getStringExtra(EXTRA_CUSTOM_WIDGET); if ("search_widget".equals(customWidget)) { mAppWidgetHost.deleteAppWidgetId(appWidgetId); } else { AppWidgetProviderInfo appWidget = mAppWidgetManager .getAppWidgetInfo(appWidgetId); Log.d("addAppWidget", "configure:" + appWidget.configure); if (appWidget.configure != null) { // 弹出配置界面 Intent intent = new Intent( 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 * * @param data */ private void completeAddAppWidget(Intent data) { Bundle extras = data.getExtras(); int appWidgetId = extras .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager .getAppWidgetInfo(appWidgetId); View hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); mWidgetLayout.addInScreen(hostView, appWidgetInfo.minWidth, appWidgetInfo.minHeight); } @Override protected void onDestroy() { try { mAppWidgetHost.stopListening(); } catch (NullPointerException ex) { Log.i(TAG, "problem while stopping AppWidgetHost during Launcher destruction", ex); } super.onDestroy(); } @Override public boolean onLongClick(View v) { Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetHost.allocateAppWidgetId()); // start the pick activity startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET); return false; } }</span>
请看效果图:
转载请注明出处:/article/1411300.html
相关文章推荐
- Android将Widget添加到自己的应用程序
- Android将Widget添加到自己的应用程序
- Android 4.0为Launcher主界面所有应用程序图标添加统一背景主题
- 深度分析:Android4.3下MMS发送到附件为音频文件(音频为系统内置音频)的彩信给自己,添加音频-发送彩信-接收彩信-下载音频附件-预览-播放(三,接收彩信<1,接收短信>)
- android--解--它们的定义tabhost(动态添加的选项+用自己的主动性横向滑动标签+手势切换标签页和内容特征)
- Google Maps Android API v2 (3)- 地图添加到Android应用程序
- Android 分享功能(一)添加自己应用到系统分享列表
- android开发:EditText如何正确自己实现删除和添加数据
- 为Android应用程序添加日志记录
- ListView添加删除FooterView java.lang.Class Cast Exception: android.widget.HeaderViewListAdapter
- 将自己的应用程序编译进Android操作系统作为系统应用启动
- imx6q yocto 添加自己的应用程序
- 给android系统添加自己想要的属性
- Android Launcher开发(五)添加应用程序桌面快捷方常见问题及解决方案
- Android为ViewPager添加切换动画——自己定义ViewPager
- 说说Android桌面(Launcher应用)背后的故事(二)——应用程序的添加
- 使用 Twilio 云服务向 Android 和 iOS 应用程序添加文本消息
- Android 百度地图添加标记+定位+导航(从定位点开始导航到自己添加的点)
- 深度分析:Android4.3下MMS发送到附件为音频文件(音频为系统内置音频)的彩信给自己,添加音频-发送彩信-接收彩信-下载音频附件-预览-播放(二,发送彩信<1>)
- Android已有的原生Camera框架中添加自己的API的实现方案。