2012-03-30 19 views
5

Ho un appwidget davvero semplice (due visualizzazioni di testo e un pulsante). L'ho provato su un Touchpad, Droid 1 e un Droid Razr. Funziona su tutto tranne il Razr. Quando aggiungo il widget alla homescreen non viene visualizzato; è solo invisibile. Se tengo fermo il punto in cui si trova, seleziona un widget e se lo sposto vedo che altri widget si spostano, ma è completamente invisibile.AppWidget Android non visualizzato su alcuni telefoni

Ho inserito alcuni toast nei metodi onReceive e onEnabled e lo Toast visualizza tutte le informazioni corrette (ad esempio azione intent ed extra).

Qualcuno ha qualche esperienza con questo?

EDIT: prega di tenere presente che questo è solo per il debug e non segue le migliori pratiche

public class GoogleTalkWidget extends AppWidgetProvider { 

    Button sendMessage; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Received Intent Action = " + 
       intent.getAction(), Toast.LENGTH_SHORT).show(); 

     if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
      RemoteViews views = new RemoteViews(context.getPackageName(), 
       R.layout.main_widget); 

      views.setTextViewText(R.id.widget_message, 
       (CharSequence)intent.getStringExtra("MESSAGE")); 

      views.setTextViewText(R.id.widget_sender, 
       (CharSequence)intent.getStringExtra("SENDER")); 

      Toast.makeText(context, "Received " + 
       intent.getStringExtra("MESSAGE") + " FROM " + 
       intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

      ComponentName cn = new ComponentName(context, 
       GoogleTalkWidget.class); 

      AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 

     } 
     super.onReceive(context, intent); 
    } 

    @Override 
    public void onEnabled(final Context context){ 
     super.onEnabled(context); 

     Toast.makeText(context, "Enabled", Toast.LENGTH_SHORT).show(); 
    } 

} 
+0

'OnReceive()'? Intendi 'onUpdate()' del tuo 'AppWidgetProvider'? – CommonsWare

+0

puoi anche sovrascrivere il metodo 'onReceive()' in una appwidget ... Penso che lo abbiano lasciato perché le versioni precedenti di Android avevano alcuni problemi con 'onDelete' – Eliezer

+0

Lo capisco. Tuttavia, 'onUpdate()' è in genere dove forniresti 'RemoteViews' per dichiarare cosa dovrebbe andare nel widget dell'app. Viene chiamato 'onUpdate()' e stai fornendo 'RemoteViews' con successo? C'è qualcosa in LogCat che potrebbe riguardare (ad esempio, tracce di stack)? – CommonsWare

risposta

1

La cosa migliore che posso pensare (dovrebbe non v'è un bug o altri problemi con la launcher del Razr) è che le tue risorse non sono configurate correttamente. Forse il Razr ha una densità di dpi diversa e non ci sono risorse per quella densità nel tuo progetto.

Prova ad esempio per spostare tutti i drawable che compongono il tuo widget nella cartella res \ drawable-nodpi e vedere come sta andando.

EDIT: ho visto qualcosa di strano nel codice

nel metodo OnReceive classe GoogleTalkWidget, il tuo widget viene aggiornato solo quando si riceve il messaggio Utils.RECEIVED_MESSAGE_WIDGET. Non so a cosa serva questo messaggio, ma un widget dell'app, la prima volta che viene aggiunta nella schermata iniziale, riceve android.appwidget.action.APPWIDGET_UPDATE e qualsiasi altro filtro intent è registrato nel file manifest e sono trasmesso dal sistema in quel momento (e ovviamente gli intenti trasmessi sulle trasmissioni).

Se fossi nella tua posizione vorrei cambiare il metodo OnReceive come segue:

@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Received Intent Action = " + 
      intent.getAction(), Toast.LENGTH_SHORT).show(); 
    super.onReceive(context, intent); 

    String msg = "No messages yet"; 

    RemoteViews views = new RemoteViews(context.getPackageName(), 
      R.layout.main_widget); 

    if(intent.getAction().equals(Utils.RECEIVED_MESSAGE_WIDGET)){ 
     msg = intent.getStringExtra("MESSAGE"); 

     views.setTextViewText(R.id.widget_sender, 
      (CharSequence)intent.getStringExtra("SENDER")); 

     Toast.makeText(context, "Received " + 
      intent.getStringExtra("MESSAGE") + " FROM " + 
      intent.getStringExtra("SENDER"), Toast.LENGTH_SHORT).show(); 

     ComponentName cn = new ComponentName(context, 
      GoogleTalkWidget.class); 
    } 

    views.setTextViewText(R.id.widget_message, msg); 

    AppWidgetManager.getInstance(context).updateAppWidget(cn, views); 
} 

e vedere cosa succede.

Se il tuo widget non appare, potrebbe essere un problema con Razr, ma questo è diverso perché suppongo che un sacco di altri widget funzionino bene.

Inoltre, sebbene il codice sia solo per il debug, il tuo approccio è un po 'problematico. Il posto migliore per aggiornare le viste del widget è nel metodo onUpdate di AppWidgetProvider e non nel onReceive. Android fornisce il metodo onUpdate a tale scopo e l'onReceive per informarti che è arrivata una trasmissione registrata. La differenza fondamentale è che nel metodo onUpdate, Android ha estratto per te tutti i parametri necessari dagli extra Intent ricevuti. Un'altra cosa sugli aggiornamenti dei widget è che dovresti fornire un androide: valore UpdatePeriodMillis diverso da 0 (2100000 è un buon valore) nel tuo file xml del widget anche se non vuoi aggiornamenti periodici per il tuo widget. Ho visto da qualche parte che il metodo onReceive non può essere chiamato se questo valore è 0.

Tieni presente che AppWidgetProvider come ricevitore Broadcast vive solo finché il metodo onReceive fa il suo lavoro, dopodiché viene distrutto e quindi non è un buon posto per codice "interattivo" come ascoltatori dell'interfaccia utente, ecc. Ti sto dicendo questo perché hai una dichiarazione Button (Button sendMessage;) nella parte superiore della tua classe GoogleTalkWidget.

Spero che questo aiuti ...

+0

In questo momento sto solo cercando di farlo funzionare così le sue ossa molto nude .. .no drawable o qualcosa del genere .... solo una textview e pulsante – Eliezer

+0

@Eliezer Vedi la mia risposta modificata ... – Christos

+0

Per quanto riguarda il contenuto di 'onReceive' non ho aggiornato questo post da quando me ne sono dimenticato e andò avanti quando ancora non riuscivo a risolvere il problema. Da quando ho postato la domanda ho provato a prendere parti del codice fino a quando ho avuto solo un 'onUpdate' che ha chiamato' super' e basta; ancora non ha funzionato. Per quanto riguarda 'onUpdate' vs' onReceive' non ci ho pensato molto da quando questo progetto è andato in backburner a causa di questo problema con il Razr ma il tuo contributo è apprezzato! – Eliezer

Problemi correlati