Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: AppWidget with custom view not working

I am creating a appwidget that consists of a single custom view called 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>

layout/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>

Foo:

  public class Foo extends View 
  {..}

I tested the Foo view in a normal android app, and it works perfectly. However, when I try to run the widget I get "error while loading widget". When I remove the Foo view from the widget, everything is fine. So it has something to do with the Foo view.

Unfortunately I can't get any more specific errors in DDMS, cause I don't know of a way to debug widgets.

I would like to know if it is indeed possible to use your own custom views in a app-widget? Am I doing something wrong here?

like image 828
Peterdk Avatar asked Oct 31 '10 09:10

Peterdk


3 Answers

I pretty much left my custom view intact, and implemented an ImageView for my widget, then rendered the view using the 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);
like image 131
Chrispix Avatar answered Oct 21 '22 09:10

Chrispix


Another way to do this without using 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);

I used cache not to redraw all the view so I couldn't use the code above. And I find it more elegant. I hope it could be useful to someone.

like image 14
Yoann Delouis Avatar answered Oct 21 '22 09:10

Yoann Delouis


You cannot have ANY custom view used in widget. In fact, even those android-predfined views are not all supported.

For detailed list of supported widgets/layouts, please read the documentation. Anything other than those documented cannot be placed in widgets.

like image 8
xandy Avatar answered Oct 21 '22 11:10

xandy