2010-10-31 26 views
16

Sto creando un appwidget che consiste in una singola vista personalizzata chiamata Foo.Android: AppWidget con visualizzazione personalizzata non funzionante

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 
    {..} 

ho testato la vista Foo in una normale applicazione per Android, e funziona perfettamente. Tuttavia, quando provo a eseguire il widget ricevo "error while loading widget". Quando rimuovo la vista Foo dal widget, tutto va bene. Quindi ha qualcosa a che fare con la vista Foo.

Purtroppo non riesco a ottenere errori più specifici in DDMS, perché non conosco un modo per eseguire il debug dei widget.

Mi piacerebbe sapere se è effettivamente possibile utilizzare le proprie visualizzazioni personalizzate in un app-widget? Sto facendo qualcosa di sbagliato qui?

+0

Cosa c'è nella visualizzazione Foo? Puoi avere solo certe viste in un widget. Non sono nemmeno sicuro di poter istanziare un widget con una vista creata con il codice. – Falmarri

+0

Avevo creato una cosa visiva aggiornata dinamicamente e completamente personalizzata. Bello come widget, ma suppongo che proverò ora a renderlo in una bitmap nel 'provider' e inserirlo in una visualizzazione di immagini supportata. – Peterdk

+0

Sì. È esattamente lo stesso che ho fatto per l'animazione del mio widget. – xandy

risposta

43

ho praticamente lasciato la mia vista personalizzata intatta, e realizzato un ImageView per il mio widget di, poi reso la vista utilizzando il 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

Ho risolto il problema utilizzando un 'ImageView'. Tuttavia, non pensavo di mantenere la mia visione personalizzata. Ho integrato il codice di rendering nel 'Provider'. Questa è comunque una soluzione molto bella! – Peterdk

+0

Ottimo! Così semplice e funziona perfettamente. – Ridcully

+0

In quale metodo dovrei inserire questo? – vikifor

6

Non è possibile disporre di ANY visualizzazione personalizzata utilizzata nel widget. In effetti, anche le viste predeterminate da Android non sono tutte supportate.

Per l'elenco dettagliato di widget/layout supportati, leggere lo documentation. Qualsiasi cosa diversa da quelle documentate non può essere inserita nei widget.

+1

Wow, questo fa schifo ... Perché diavolo hanno fatto? – Peterdk

+1

Lasciami indovinare, dato che per widget, tu (come sviluppatore di widget) non possiedi il processo/thread che esegue il rendering del widget, infatti, la schermata iniziale/launcher lo possiede e lo esegue. Tale limitazione si applica per evitare che FC o widget programmati male uccidano l'app della schermata iniziale. – xandy

+0

Ho visto questo, ed è stato piuttosto deluso. Ho pensato che ci dovrebbe essere un modo per aggirarlo. Ho deciso di condividere come questo thread ha le mie marce che si trasformano :) – Chrispix

7

vedere documentation.

AnalogClock, Button, Chronometer, ImageButton, ImageView, ProgressBar e TextView sono le viste supportate. Per i layout devi usare FrameLayout, LinearLayout o RelativeLayout.

+6

In effetti, e le sottoclassi di quelle (anche le tue) NON sono supportate. – Peterdk

10

Un altro modo per farlo senza usare 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); 

Ho usato la cache per non ridisegnare tutta la vista, quindi non ho potuto usare il codice sopra. E lo trovo più elegante. Spero possa essere utile a qualcuno.

Problemi correlati