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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

具有特定形状的 Android 自定义视图

java Android - 具有自定义视图的对话框

java Android - 具有自定义视图的对话框

java Android - 具有自定义视图的对话框

java Android - 具有自定义视图的对话框

java Android - 具有自定义视图的对话框