Android:具有自定义视图的 AppWidget 不起作用
Posted
技术标签:
【中文标题】Android:具有自定义视图的 AppWidget 不起作用【英文标题】:Android: AppWidget with custom view not working 【发布时间】:2011-05-03 00:44:19 【问题描述】:我正在创建一个 appwidget,它包含一个名为 Foo 的自定义视图。
xml/widget.xml:
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="72dp"
android:updatePeriodMillis="0"
android:initialLayout="@layout/widget_layout">
</appwidget-provider>
布局/widget_layout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>
<package.name.Foo
android:layout_
android:layout_
/>
</LinearLayout>
富:
public class Foo extends View
..
我在一个普通的安卓应用程序中测试了Foo
视图,它运行良好。但是,当我尝试运行小部件时,我得到了"error while loading widget"
。当我从小部件中删除 Foo
视图时,一切都很好。所以它与Foo
视图有关。
很遗憾,我在 DDMS 中找不到任何更具体的错误,因为我不知道调试小部件的方法。
我想知道是否确实可以在应用小部件中使用您自己的自定义视图? 我在这里做错了吗?
【问题讨论】:
您的 Foo 视图中有什么?您只能在小部件中拥有某些视图。我什至不确定您是否可以使用代码创建的视图来实例化小部件。 我创建了一个完全自定义绘制的动态更新的视觉对象。作为一个小部件很好,但我想我现在会尝试将它渲染到provider
中的位图并将其推送到支持的图像视图。
是的。这与我为小部件动画所做的完全相同。
【参考方案1】:
我几乎完好无损地保留了我的自定义视图,并为我的小部件实现了一个 ImageView,然后使用 getDrawingCache() 渲染了该视图
MyView myView = new MyView(context);
myView.measure(150,150);
myView.layout(0,0,150,150);
myView.setDrawingCacheEnabled(true);
Bitmap bitmap=myView.getDrawingCache();
remoteViews.setImageViewBitmap(R.id.dial, bitmap);
【讨论】:
我确实通过使用ImageView
解决了这个问题。然而,我没想过要保留我的自定义视图。我在Provider
中集成了渲染代码。然而,这是一个非常好的解决方案!
我应该把这个放在哪个方法中?
使用自定义视图的位图是一个了不起的解决方案。
附加说明:如果您的自定义视图扩展了线性布局,那么您需要使用最大高度约束进行测量,否则它不会扩展以填充空间。【参考方案2】:
不使用getDrawingCache()
的另一种方法:
MyView myView = new MyView(this);
myView.measure(500, 500);
myView.layout(0, 0, 500, 500);
Bitmap bitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.ARGB_8888);
myView.draw(new Canvas(bitmap));
remoteViews.setImageViewBitmap(R.id.imageView, bitmap);
我使用缓存不重绘所有视图,所以我不能使用上面的代码。 而且我觉得它更优雅。 我希望它对某人有用。
【讨论】:
我更喜欢这个解决方案,因为在接受的解决方案中使用的 getDrawingCache 已被弃用。就我而言,使用myView.measure(View.MeasureSpec.makeMeasureSpec(500, EXACTLY), View.MeasureSpec.makeMeasureSpec(500, EXACTLY))
效果更好【参考方案3】:
请参阅documentation。
AnalogClock、Button、Chronometer、ImageButton、ImageView、ProgressBar 和 TextView 是支持的视图。对于布局,您必须使用 FrameLayout、LinearLayout 或 RelativeLayout。
【讨论】:
确实,它们的子类(甚至你自己的)都不受支持。【参考方案4】:您不能在小部件中使用 ANY 自定义视图。事实上,即使是那些 android-predfined 的视图也不是全部都支持的。
有关支持的小部件/布局的详细列表,请阅读documentation。文档之外的任何内容都不能放在小部件中。
【讨论】:
哇,这太糟糕了......他们到底为什么要这样做? 让我猜猜,因为对于小部件,您(作为小部件开发人员)不拥有渲染小部件的进程/线程,实际上,主屏幕/启动器拥有并渲染它。此类限制适用于防止 FC 或编程不当的小部件杀死主屏幕应用程序。 我看到了这个,很失望。我想应该有办法解决它。我决定分享,因为这个线程让我的齿轮转动:) @Chris。我的感觉和你一样。根据您需要做什么,它可能有其他选择。我个人开发了一个播放精灵动画的小部件,不是很成熟,但想法是使用“setBitmap”组合和交换外观。 andytsui.wordpress.com/2010/06/06/… 如果您寻找的不仅仅是“点击”之外的交互性,那么标准主页将无济于事,您必须在 aHome 或 launcherpro 或类似工具中进行。以上是关于Android:具有自定义视图的 AppWidget 不起作用的主要内容,如果未能解决你的问题,请参考以下文章