Android:自定义视图不起作用的AppWidget

Pet*_*rdk 17 android android-widget

我正在创建一个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>
Run Code Online (Sandbox Code Playgroud)

布局/ 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>
Run Code Online (Sandbox Code Playgroud)

富:

  public class Foo extends View 
  {..}
Run Code Online (Sandbox Code Playgroud)

Foo在一个普通的Android应用程序中测试了视图,它运行得很好.但是,当我尝试运行小部件时,我得到了"error while loading widget".当我Foo从小部件中删除视图时,一切都很好.所以它与Foo视图有关.

不幸的是,我无法在DDMS中获得任何更具体的错误,因为我不知道调试小部件的方法.

我想知道是否确实可以在app-widget中使用您自己的自定义视图?我在这里做错了吗?

Chr*_*pix 46

我几乎完全保留了自定义视图,并为我的小部件实现了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);
Run Code Online (Sandbox Code Playgroud)

  • 我确实通过使用`ImageView`解决了这个问题.但是我没想到保留我的自定义视图.我将渲染代码集成在`Provider`中.然而,这是一个非常好的解决方案! (2认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)

我使用缓存不重绘所有视图,所以我无法使用上面的代码.而且我发现它更优雅.我希望它对某人有用.


han*_*ide 8

文档.

支持的视图包括AnalogClock,Button,Chronometer,ImageButton,ImageView,ProgressBar和TextView.对于布局,您必须使用FrameLayout,LinearLayout或RelativeLayout.

  • 实际上,不支持那些(甚至是你自己的)的子类. (7认同)

xan*_*ndy 7

您不能在窗口小部件中使用任何自定义视图.事实上,即使是那些Android预定义的视图也不是全部支持.

有关支持的小部件/布局的详细列表,请阅读文档.除了记录的内容之外的任何内容都不能放在小部件中.

  • 让我猜一下,因为对于小部件,您(作为小部件开发人员)不拥有呈现小部件的进程/线程,实际上,主屏幕/启动器拥有并呈现它.此限制适用于防止FC或编程不佳的小部件杀死主屏幕应用程序. (2认同)