2013-11-09 4 views
7

Creo il widget per l'applicazione Android (in Java, ovviamente). Ho RemoteViews classici creati dal layout (utilizzando il layout id)Come modificare/cambiare la vista dal layout in RemoteView o creare RemoteView dalla vista?

RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.view); 

e ho bisogno di modificare o visualizzare il cambiamento (identificare da id). Nella visualizzazione classica è facile, utilizzando la funzione findViewById.

View v = ... //inflate layout R.layout.view 
View my = v.findViewById(R.id.myViewId); 
processView(my); //filling view 

Ma non è supportato in RemoteViews. È possibile ottenere la vista usando apply(), ma dopo processView e reapply() non vedo cambiamenti in vista.

View v = rv.apply(context, null); 
View my = v.findViewById(R.id.myViewId); 
processView(my); //this work's fine 
rv.reapply(context,my); 

In secondo luogo, l'opzione peggiore, è ottenere le mie richieste RemoteViews forma vista, elaborarla, eliminare i vecchi vista e aggiungere nuova vista elaborati utilizzando addView().

RemoteViews rv = ... 
View my = ... //apply, find and process 
//remove old view 
RemoteViews rvMy = ... //create RemoteViews from View 
rv.addView(rvMy) 

Ma io non so come creare RemoteViews da Vista (è possibile?). Qualche idea su come risolvere questo problema?

+0

Penso che la tua domanda abbia bisogno di un po 'di chiarimenti. Stai cercando di cambiare il testo delle visualizzazioni di RemoteViews senza conoscerne l'ID? –

risposta

1

A causa di modifica/cambio (sub) vista da removeview o remoteview creare da vista è propably non possibile (su informazioni di base che ho fondato) ho risolto il mio problema usando naming visualizzazione necessaria (la maggior parte di textview), ottenendo id visualizzazioni con i suoi nomi e reflection e proc ess in cycle. Per la denominazione è possibile utilizzare bash, python o qualsiasi altra cosa.

Esempio:

RemoteView rv = ... 

/* 
exemplary rv layout: 
+-----+-----+-----+-----+-----+-----+ 
|tv0x0|tv0x1|tv0x2|tv0x3|tv0x4|tv0x5| 
+-----+-----+-----+-----+-----+-----+ 
|tv1x0|tv1x1|tv1x2|tv1x3|tv1x4|tv1x5| 
+-----+-----+-----+-----+-----+-----+ 
*/ 

String prefix = "tv"; 
for(int i=0; i<2;i++) 
{ 
    for(int j=0; j<6; j++) 
    { 
     // use reflection, searched in stackoverflow 
     int id = getItemIdFromName(prefix+i+"x"+j); 
     // working with concrete id using RemoteView set functions, e.g 
     rv.setTextViewText(id, String.ValueOf(i); 
    } 
} 

questo modo è possibile processo un gran numero di visualizzazioni e applicare funzione remoteview per loro.

3

provare in questo modo:

 RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget); 

     remoteViews.setTextViewText(R.id.widget_textview, text); <---- here you can set text 

     // Tell the widget manager 
     appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 

Ecco un post utile per capire widget di comportamento:

http://www.vogella.com/articles/AndroidWidgets/article.html

+4

Grazie per la risposta. Questo metodo (e altri set *) per l'impostazione delle proprietà dell'oggetto RemoteViews che conosco. Il problema è che devo conoscere tutti gli ID e impostare ciascuno di essi separatamente (nel widget e anche nel layout) - è possibile, ma non è buono! Ad esempio: ora ho un layout con struttura definita. Quando voglio riempirli, lo metto nel metodo presenter (presente (Vedi v)) ed è tutto! La soluzione possibile è forse l'impostazione di ID nel layout e l'uso del reflection per iterarlo ed elaborarlo. Se non migliori opzioni! [Spero che sia comprensibile] – honzakuzel1989