- 浏览: 661505 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ZHOU452840622:
少了一个构造函数 晕
Android画图之Matrix(一) -
ZHOU452840622:
06-30 17:39:19.193: E/AndroidRu ...
Android画图之Matrix(一) -
ZHOU452840622:
为什么报错哦
Android画图之Matrix(一) -
悬空90:
只是获取activity的名字而已, 没有实例。 反射 ...
获取屏幕上正在显示的activity -
night_iv:
重写下面两个函数EditText完全作废,点击没有反应没有光标 ...
Android自由选择TextView的文字
经常看到一些教程教你如何写appwidget,但是,你知道你的appwidget是如何被添加到桌面上的吗?
一般的,如果是做桌面的童鞋,基本上都会让自己的桌面支持appwidget。下面说说如何实现。
首先是得定义一个承载appwidget的容器,系统的Launcher里面是用的CellLayout,实现的很不错。我这里就用一个简单的自定义ViewGroup来搞定,它是以长按的坐标处为要添加的appwidget的起始位置,简单点说就是按到哪儿就添加到哪儿。
package chroya.demo.widget; import android.content.Context; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; /** * 承载widget的容器 * @author chroya */ public class WidgetLayout extends ViewGroup { //存放touch的坐标 private int[] cellInfo = new int[2]; private OnLongClickListener mLongClickListener; public WidgetLayout(Context context) { super(context); mLongClickListener = new OnLongClickListener() { @Override public boolean onLongClick(View v) { 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(mLongClickListener); addView(child, lp); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); LayoutParams lp; for(int index=0; index<getChildCount(); index++) { lp = (LayoutParams) getChildAt(index).getLayoutParams(); getChildAt(index).measure( MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, lp.width), MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, lp.height)); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { cellInfo[0] = (int)event.getX(); cellInfo[1] = (int)event.getY(); return super.dispatchTouchEvent(event); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { LayoutParams lp; for(int index=0; index<getChildCount(); index++) { lp = (LayoutParams) getChildAt(index).getLayoutParams(); getChildAt(index).layout(lp.x, lp.y, lp.x+lp.width, lp.y+lp.height); } } public static class LayoutParams extends ViewGroup.LayoutParams { int x; int y; public LayoutParams(int width, int height) { super(width, height); } } }
然后是重点了。还记得系统默认的桌面上,长按的时候出现的上下文菜单吗?里面有好几个选项,选择widget之后,会弹出一个已经安装的widget列表,选择一个widget之后,就会添加到桌面。我们可以把第一步去掉,长按之后,直接弹出已安装的widget列表,这是一个activity,用AppWidgetManager.ACTION_APPWIDGET_PICK这个Intent来启动,必须带上Extras,下面给出代码中有,不详叙。
package chroya.demo.widget; import static android.util.Log.d; import java.util.ArrayList; import android.app.Activity; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnLongClickListener; /** * 添加appwidget * @author chroya * */ public class Main extends Activity { private AppWidgetHost mAppWidgetHost; private AppWidgetManager mAppWidgetManager; private WidgetLayout layout; private static final int REQUEST_PICK_APPWIDGET = 1; private static final int REQUEST_CREATE_APPWIDGET = 2; private static final int APPWIDGET_HOST_ID = 0x100; private static final String EXTRA_CUSTOM_WIDGET = "custom_widget"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAppWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); mAppWidgetHost = new AppWidgetHost(getApplicationContext(), APPWIDGET_HOST_ID); //开始监听widget的变化 mAppWidgetHost.startListening(); layout = new WidgetLayout(this); layout.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { addWidget(); return false; } }); setContentView(layout); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent 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) { // Clean up the appWidgetId if we canceled int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); if (appWidgetId != -1) { mAppWidgetHost.deleteAppWidgetId(appWidgetId); } } } /** * 选中了某个widget之后,根据是否有配置来决定直接添加还是弹出配置activity * @param data */ private void addAppWidget(Intent data) { int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); String customWidget = data.getStringExtra(EXTRA_CUSTOM_WIDGET); d("addAppWidget", "data:"+ customWidget); if ("search_widget".equals(customWidget)) { //这里直接将search_widget删掉了 mAppWidgetHost.deleteAppWidgetId(appWidgetId); } else { AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId); 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 */ private void addWidget() { int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); // add the search widget ArrayList<AppWidgetProviderInfo> customInfo = new ArrayList<AppWidgetProviderInfo>(); AppWidgetProviderInfo info = new AppWidgetProviderInfo(); info.provider = new ComponentName(getPackageName(), "XXX.YYY"); info.label = "Search"; info.icon = R.drawable.ic_search_widget; customInfo.add(info); pickIntent.putParcelableArrayListExtra( AppWidgetManager.EXTRA_CUSTOM_INFO, customInfo); ArrayList<Bundle> customExtras = new ArrayList<Bundle>(); Bundle b = new Bundle(); b.putString(EXTRA_CUSTOM_WIDGET, "search_widget"); customExtras.add(b); pickIntent.putParcelableArrayListExtra( AppWidgetManager.EXTRA_CUSTOM_EXTRAS, customExtras); // start the pick activity startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET); } /** * 添加widget * @param data */ private void completeAddAppWidget(Intent data) { Bundle extras = data.getExtras(); int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); d("completeAddAppWidget", "dumping extras content="+extras.toString()); d("completeAddAppWidget", "appWidgetId:"+ appWidgetId); AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); View hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo); layout.addInScreen(hostView, appWidgetInfo.minWidth, appWidgetInfo.minHeight); } }
运行效果如下:
需要注意的几点:
1。 必须调用AppWidgetHost的startListening方法来监听appwidget的状态变化,否则添加上去的appwidget不会更新的。
2。 需要override一个onActivityResult方法,来接收添加appwidget和appwidget的配置activity的返回值。
3。 启动AppWidgetManager.ACTION_APPWIDGET_PICK这个Intent,必须要给列表中加上自己定义的一个选项,否则出错。如本例中是用的Search。
源码见附件。
- WidgetContainerDemo.zip (47.3 KB)
- 下载次数: 996
评论
StackTrace=bitmap size exceeds VM budgetjava.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.Bitmap.nativeCreateFromParcel(Native Method)
at android.graphics.Bitmap.access$000(Bitmap.java:29)
at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:927)
at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:933)
at android.widget.RemoteViews$ReflectionAction.<init>(RemoteViews.java:344)
at android.widget.RemoteViews.<init>(RemoteViews.java:559)
at android.widget.RemoteViews$1.createFromParcel(RemoteViews.java:1012)
at android.widget.RemoteViews$1.createFromParcel(RemoteViews.java:1015)
at com.android.internal.appwidget.IAppWidgetHost$Stub.onTransact(IAppWidgetHost.java:53)
at android.os.Binder.execTransact(Binder.java:304)
at dalvik.system.NativeStart.run(Native Method)
这样的情况一般出现在大分辨率的机子上,图片占用的内存过大而导致的。暂时没有很完美的解决办法,但是还是能用一些方法来避免,网上可以搜到的。
StackTrace=bitmap size exceeds VM budgetjava.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.Bitmap.nativeCreateFromParcel(Native Method)
at android.graphics.Bitmap.access$000(Bitmap.java:29)
at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:927)
at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:933)
at android.widget.RemoteViews$ReflectionAction.<init>(RemoteViews.java:344)
at android.widget.RemoteViews.<init>(RemoteViews.java:559)
at android.widget.RemoteViews$1.createFromParcel(RemoteViews.java:1012)
at android.widget.RemoteViews$1.createFromParcel(RemoteViews.java:1015)
at com.android.internal.appwidget.IAppWidgetHost$Stub.onTransact(IAppWidgetHost.java:53)
at android.os.Binder.execTransact(Binder.java:304)
at dalvik.system.NativeStart.run(Native Method)
但是有一点我遇到了一个问题。
就是子View 和父View 事件重复问题。
具体的就是 ScrollView 里面有一个TextView TextView 有一个OnTouchListener
我做的功能是 让这个TextView 可以拖动,但是拖动的时候触发了 ScrollView 的事件 导致 TextView 移动不成功(动几下就停了)
请问 这种怎么解决? 怎么在子View 里面屏蔽/拦截掉父View的事件?
TextView 的OnTouchListener里面onTouch返回值设为true。ScrollView也setOnTouchListener,返回false。
但是有一点我遇到了一个问题。
就是子View 和父View 事件重复问题。
具体的就是 ScrollView 里面有一个TextView TextView 有一个OnTouchListener
我做的功能是 让这个TextView 可以拖动,但是拖动的时候触发了 ScrollView 的事件 导致 TextView 移动不成功(动几下就停了)
请问 这种怎么解决? 怎么在子View 里面屏蔽/拦截掉父View的事件?
发表评论
-
Android NFC内部机制分析
2012-08-06 19:48 3一、初始 一般需要使用nfc ... -
Android NFC简介
2012-08-03 11:31 4372目录: Android NFC ... -
Android放大镜的实现
2011-02-24 20:29 14327快三个月了没写博客了,因为工作调动,很多经验、心得都没 ... -
Android简单的圆盘形菜单
2010-12-01 17:10 15509今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺 ... -
Android的3D旋转
2010-11-29 12:27 23211见过没有用opengl的3D动画,看了一下,是 ... -
ConditionVariable的用法
2010-11-07 21:35 8758线程操作经常用到wait和notify,用起来稍显 ... -
Android自定义长按事件
2010-11-06 20:34 44724Android系统自带了长按事件,setOnLongC ... -
Android获取应用程序的大小
2010-10-22 23:53 11257今天碰到个问 ... -
Android获取其他包的Context实例然后干坏事
2010-09-12 14:55 25141Android中有Context ... -
android监听文件和目录的创建删除移动等事件
2010-09-11 21:18 13682android.os下的FileObserver类 ... -
解决android自定义标题栏充满的问题
2010-09-10 15:27 10802一个接着一个的activity,写啊写,调啊调 ... -
Android中用AsyncTask简单实现多线程
2010-09-07 14:11 5237一般情况下在an ... -
Android自由选择TextView的文字
2010-09-02 15:47 19425用过EditText的都 ... -
NDK入门、提高和实战
2010-08-04 18:25 3299网上也有一些对NDK ... -
linux下用adb连接手机的问题解决
2010-08-02 16:17 6069在linux里面,模拟器可以直接识别,使用adb也 ... -
Android系统事件的recycle原理
2010-07-22 19:07 6262最近封装一些功能 ... -
Android画图之Matrix(二)
2010-07-15 22:01 34078上一篇Android画图之Matrix(一) 讲 ... -
Android画图之Matrix(一)
2010-07-13 22:54 32912Matrix ,中文里叫矩阵, ... -
Android画图之Bitmap(二)
2010-07-11 22:21 10835前面一篇博文Android画图之Bitma ... -
Android画图之Bitmap(一)
2010-07-11 19:51 15692最近写电子书 ...
相关推荐
Android 桌面控件(AppWidget)是Android操作系统提供的一种独特功能,允许开发者创建可以在用户主屏幕上显示的小型应用程序组件。这些控件通常提供快速访问应用的核心功能或展示实时信息,如天气预报、日历事件或...
在Android开发中,AppWidget是桌面小部件,它允许用户在主屏幕上与应用程序进行交互,而无需实际打开应用。在本篇博文中,我们将深入探讨如何在AppWidget中启动一个新的Activity,这通常是为了提供更丰富的用户体验...
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> android:name="android.appwidget.provider" android:resource="@xml/app_widget_info" /> ``` 其中,`<meta-data>` 标签引用了一个 ...
9. **服务(Service)与AppWidget**: 在某些情况下,你可能需要使用服务来支持AppWidget的后台任务,例如定时更新。Service可以用来处理这些长时间运行的任务,同时保持小部件的更新。 10. **兼容性与版本差异**: ...
**Android之AppWidget详解** AppWidget是Android操作系统提供的一种组件,允许开发者在用户主屏幕上创建小型应用程序,这些小部件...通过理解和熟练运用AppWidget,开发者可以构建出更加丰富和个性化的Android应用。
在Android系统中,AppWidget是桌面小部件的实现方式,它允许开发者将应用程序的功能和信息直接集成到用户的主屏幕上,用户无需打开应用就能与之交互。AppWidget虽然看似简单,但其实涉及到了许多核心的Android组件和...
这个压缩包“Android小部件AppWidget.rar”似乎包含了一些关于创建和实现Android Widget小组件的资源,可能是源代码、文档或者示例项目。 在Android开发中,AppWidget是Widget小组件的主要实现类。它是由Android ...
在这个名为"AppWidget-master"的压缩包中,我们很可能是得到了一个示例项目,用于演示如何创建一个能够显示列表并支持刷新功能的Android App Widget。 首先,我们需要理解App Widget的基本架构。App Widget由XML...
创建一个新的Android项目,确保目标API版本支持AppWidget功能。在`AndroidManifest.xml`中声明AppWidget提供者,例如: ```xml <receiver android:name=".AppWidgetProvider"> <action android:name="android....
通过深入学习和实践这个源码示例,你将能够掌握AppWidget的开发流程,为自己的Android应用添加更多元化的交互方式,提升用户体验。同时,这也为你进一步探索Android系统的广播机制、服务、ContentProvider等高级特性...
在Android开发中,AppWidget是桌面小部件,可以让用户在主屏幕上放置应用程序的轻量级交互界面。在Android 4.0(API级别14)及以上版本,开发者可以创建AppWidget集合,展示一系列数据,例如列表或网格形式的条目。...
在Android平台上,Widget小组件是应用在主屏幕上提供快速访问或简单交互的一种方式。它们可以显示实时信息,比如天气、时钟或者新闻摘要,而无需用户打开完整的应用程序。本资料包"androidWidget小组件开发.zip"包含...
总的来说,Android AppWidget控件为开发者提供了扩展主屏幕功能的能力,通过简单的布局设计和广播机制,可以让用户在不打开应用程序的情况下与应用进行交互。这种交互方式不仅提升了用户体验,也使得应用程序更加...
在Android开发中,AppWidget是桌面小部件,它允许用户在主屏幕上添加应用程序的功能,而无需实际打开应用程序。本文将深入探讨如何实现Android AppWidget的高级效果,以一个掷骰子的Widget为例。 首先,创建App...
在Android平台上,开发者可以利用Android桌面小部件(Widget)功能为用户提供便捷的桌面服务,比如...通过这样的项目实践,开发者能够提升自己的Android应用开发技能,并为用户提供富有创意和实用性的桌面体验。
总之,"android 源码 android Widget开发案例 eclipse项目 直接导入"为开发者提供了一个实践平台,通过它,开发者能够深入学习Widget的工作原理,提高Android应用的桌面体验设计能力,让手机界面更加个性化和实用。
在Android系统中,小部件(AppWidget)是用户可以在主屏幕上添加的应用程序组件,它们提供了一种无需打开应用即可与应用交互的方式。本资源“安卓Andriod源码——小部件AppWidget.zip”包含了关于创建和实现Android...
AppWidget是Android系统中的一个特性,它让用户能够在主屏幕上放置应用程序的部分界面,提供快速访问和操作的功能。创建AppWidget需要实现一系列组件,如`AppWidgetProvider`(类似广播接收器的组件,响应特定事件)...
在Android开发中,App Widget是一种轻量级的应用组件,它可以被添加到用户的桌面或其它支持App Widget的应用中,为用户提供快速访问或操作的功能。App Widget虽然不像完整的应用程序那样拥有丰富的交互,但它们可以...