2010-10-31 19 views
16

Estoy creando un appwidget que consiste en una sola vista personalizada llamada Foo.Android: AppWidget con vista personalizada no funciona

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> 

diseño/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 
    {..} 

me puso a prueba la vista Foo en una aplicación para Android normal y funciona perfectamente. Sin embargo, cuando intento ejecutar el widget obtengo "error while loading widget". Cuando elimino la vista Foo del widget, todo está bien. Por lo tanto, tiene algo que ver con la vista Foo.

Desafortunadamente no puedo obtener ningún error más específico en DDMS, porque no conozco una forma de depurar widgets.

Me gustaría saber si es realmente posible utilizar sus propias vistas personalizadas en un widget de aplicación? ¿Estoy haciendo algo mal aquí?

+0

¿Qué hay en tu vista de Foo? Solo puedes tener ciertas vistas en un widget. Ni siquiera estoy seguro de que pueda crear una instancia de un widget con una vista creada con código. – Falmarri

+0

Había creado una cosa visual totalmente dibujada dinámicamente y actualizada. Agradable como un widget, pero creo que intentaré ahora renderizarlo en un mapa de bits en el 'proveedor' y llevarlo a una vista de imagen que sea compatible. – Peterdk

+0

Sí. Eso es exactamente lo mismo que hice para mi animación de widget. – xandy

Respuesta

43

yo más o menos dejado mi vista personalizada intacta, e implementado un ImageView de mi aparato, a continuación, hecho que la vista mediante la 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

Resolví el problema de hecho usando un 'ImageView'. Sin embargo, no pensé en mantener mi vista personalizada. Integré el código de representación en el 'Proveedor'. ¡Sin embargo, esta es una solución muy buena! – Peterdk

+0

¡Genial! Tan simple y funciona perfectamente bien. – Ridcully

+0

¿En qué método debo poner esto? – vikifor

6

No puede tener ANY vista personalizada utilizada en el widget. De hecho, incluso esas vistas predefinidas por Android no son compatibles.

Para obtener una lista detallada de widgets/diseños admitidos, lea documentation. Cualquier cosa que no esté documentada no se puede colocar en widgets.

+1

Guau, eso apesta ... ¿Por qué diablos hicieron eso? – Peterdk

+1

Déjeme adivinar, ya que para el widget, usted (como desarrollador de widgets) no posee el proceso/hilo que representa el widget, de hecho, la pantalla de inicio/iniciador posee y lo renderiza. Dicha limitación se aplica para evitar FC o widget mal programado mata la aplicación de la pantalla de inicio. – xandy

+0

Vi esto y me decepcionó un poco. Pensé que debería haber una forma de evitarlo. Decidí compartir ya que este hilo consiguió que mis engranajes giraran :) – Chrispix

7

ver el documentation.

AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar y TextView son las vistas admitidas. Para los diseños, debe usar FrameLayout, LinearLayout o RelativeLayout.

+6

De hecho, y las subclases de esas (incluso las suyas) NO son compatibles. – Peterdk

10

Otra forma de hacer esto sin usar 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); 

Usé caché para no volver a dibujar toda la vista, así que no pude usar el código anterior. Y lo encuentro más elegante. Espero que pueda ser útil para alguien.

Cuestiones relacionadas