Подтвердить что ты не робот

Android: AppWidget с пользовательским представлением не работает

Я создаю 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>

Foo:

  public class Foo extends View 
  {..}

Я тестировал представление Foo в обычном приложении для Android, и он отлично работает. Однако, когда я пытаюсь запустить виджет, я получаю "error while loading widget". Когда я удаляю вид Foo из виджета, все в порядке. Поэтому это имеет какое-то отношение к представлению Foo.

К сожалению, я не могу получить более конкретные ошибки в DDMS, потому что я не знаю способа отладки виджетов.

Я хотел бы знать, действительно ли можно использовать собственные пользовательские представления в виджетах приложений? Я здесь что-то не так?

4b9b3361

Ответ 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);

Ответ 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);

Я использовал кеш, чтобы не перерисовывать все представления, поэтому я не мог использовать приведенный выше код. И я нахожу его более элегантным. Надеюсь, что это может быть полезно кому-то.

Ответ 3

см. документацию .

AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar и TextView являются поддерживаемыми видами. Для макетов вы должны использовать FrameLayout, LinearLayout или RelativeLayout.

Ответ 4

У вас не может быть никакого пользовательского вида, используемого в виджетах. На самом деле, даже те представления, которые предваряются андроидами, не все поддерживаются.

Подробный список поддерживаемых виджетов/макетов см. в документации . Все, кроме документированных, не может быть размещено в виджетах.