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, потому что я не знаю способа отладки виджетов.
Я хотел бы знать, действительно ли можно использовать собственные пользовательские представления в виджетах приложений?
Я здесь что-то не так?
Ответы
Ответ 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
У вас не может быть никакого пользовательского вида, используемого в виджетах. На самом деле, даже те представления, которые предваряются андроидами, не все поддерживаются.
Подробный список поддерживаемых виджетов/макетов см. в документации . Все, кроме документированных, не может быть размещено в виджетах.