我正在创建一个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_width="fill_parent"
android:layout_height="fill_parent">
<package.name.Foo
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
富:
public class Foo extends View
{..}
我在普通的Android应用中测试了Foo
视图,它运行得很好。但是,当我尝试运行小部件时,我得到"error while loading widget"
。当我从小部件中删除Foo
视图时,一切都很好。所以它与Foo
视图有关。
不幸的是,我无法在DDMS中获得任何更具体的错误,因为我不知道调试小部件的方法。
我想知道是否确实可以在app-widget中使用您自己的自定义视图? 我在这里做错了吗?
答案 0 :(得分:44)
我几乎完全保留了自定义视图,并为我的小部件实现了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);
答案 1 :(得分:12)
在不使用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);
我使用缓存不重绘所有视图,因此我无法使用上面的代码。 而且我发现它更优雅。 我希望它对某人有用。
答案 2 :(得分:8)
请参阅documentation。
AnalogClock,Button,Chronometer,ImageButton,ImageView,ProgressBar和TextView是受支持的视图。对于布局,您必须使用FrameLayout,LinearLayout或RelativeLayout。
答案 3 :(得分:7)
您无法在窗口小部件中使用任何自定义视图。事实上,即使是那些Android预定义的视图也不是全部支持。
有关支持的小部件/布局的详细列表,请阅读documentation。除了记录的内容之外的任何内容都不能放在小部件中。