2011-07-30 3 views
0

J'ai un widget à mon application qui est actualisé toutes les 10 secondes. Si je change la langue du téléphone, le widget cesse de fonctionner. Je veux dire, les textviews ne chargent pas les textes tant qu'ils ne sont pas rafraîchis (donc après 10sec). J'ai ajouté une fonctionnalité que l'utilisateur peut ouvrir l'application en cliquant sur le widget (un ImageView). Ce problème reste toujours.Android: ne peut pas cliquer sur le widget

Tout ce problème apparaît également lorsque je redémarre le téléphone. Je dois attendre 10 secondes pour les textviews pour charger les textes, mais je ne peux pas cliquer sur le widget. Je peux changer cet intervalle à 1 sec, ce qui résoudrait ce problème (le rendant presque invisible pour l'utilisateur). Mais comme je l'ai dit, je ne peux toujours pas cliquer sur le widget.

Voici la classe complète AppWidgetProvider:

public class HelloWidget extends AppWidgetProvider { 

    public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget"; 
    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 
    private static final int REQUEST_CODE_ONE = 10; 
    String elso; 
    public static String MY_WIDGET_UPDATE = "MY_OWN_WIDGET_UPDATE"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 

     final int N = appWidgetIds.length; 
       for (int i=0; i<N; i++) { 
        int appWidgetId = appWidgetIds[i]; 
        updateAppWidget(context, appWidgetManager, appWidgetId); 
        Toast.makeText(context, "onUpdate(): " + String.valueOf(i) + " : " + String.valueOf(appWidgetId), Toast.LENGTH_SHORT).show(); 
       } 

     Intent intent = new Intent(context, UpdateService.class); 
     context.startService(intent); 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
     Intent configIntent = new Intent(context, MainActivity.class); 
     configIntent.setAction(ACTION_WIDGET_CONFIGURE); 
     PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.ImageView01, configPendingIntent); 
     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 

     Intent myIntent = new Intent(context, UpdateService.class); 
     PendingIntent pendingIntent = PendingIntent.getService(context, 0, myIntent, 0); 

     AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Calendar calendar2 = Calendar.getInstance(); 
     calendar2.setTimeInMillis(System.currentTimeMillis()); 
     calendar2.add(Calendar.SECOND, 1); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(), 50*1000, pendingIntent); 

    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 

     if(MY_WIDGET_UPDATE.equals(intent.getAction())){ 

      Bundle extras = intent.getExtras(); 
      if(extras!=null) { 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
      ComponentName thisAppWidget = new ComponentName(context.getPackageName(), HelloWidget.class.getName()); 
      int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); 
      if (appWidgetIds.length > 0) { 

       new HelloWidget().onUpdate(context, appWidgetManager, appWidgetIds); 
      } 

      } 

     } 
    } 

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
       int appWidgetId){ 

      } 
} 

De ce code c'est la partie qui sert à ouvrir le MainActivity.class de l'application lorsque l'utilisateur clique sur le widget:

RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
Intent configIntent = new Intent(context, MainActivity.class); 
configIntent.setAction(ACTION_WIDGET_CONFIGURE); 
PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, 0); 
remoteViews.setOnClickPendingIntent(R.id.ImageView01, configPendingIntent); 
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 

Ceci est la partie Manfiest:

<receiver android:name=".HelloWidget" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" /> 
     </receiver> 

Et voici le widget_provider.xml:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
android:minWidth="146dip" 
android:minHeight="72dip" 
android:updatePeriodMillis="86400000" 
android:initialLayout="@layout/main" 
/> 

Répondre

0

J'ai un widget à ma demande qui est actualisé toutes les 10 secondes [...]

Je peux changer cet intervalle de 1 sec [...]

En bref: C'est une très mauvaise pratique. Vous devriez (au maximum) seulement mettre à jour toutes les 30 minutes. En rafraîchissant votre Widget toutes les 10 secondes, vous tuez la batterie si vite que personne ne l'utilisera. Au lieu de cela, vous pouvez ajouter un bouton "refresh" qui actualise manuellement le Widget.

De même, dans la méthode onUpdate, vous n'avez pas besoin d'appeler la super-méthode. La méthode onReceive n'a pas besoin d'être surchargée! Le onUpdate -method est automatiquement appelé lorsque vous utilisez un AppWidgetProvider (pas si vous utilisez un BroadcastReceiver normal). Voir here.

Enfin et surtout, vous devriez vérifier si votre code "call-activity" est atteint et essayer de le déboguer avec le Log-class. Le LogCat-Output peut également aider à résoudre ce problème.

+0

J'ai vérifié le lien que vous avez suggéré, supprimé la méthode Override et super, mais je ne peux toujours pas cliquer sur le widget après un redémarrage ou un changement de langue. – erdomester

+0

Les docs disent que AppWidgetProvider est un récepteur de diffusion, mais avec la méthode getBroadcast, le widget ne fonctionne jamais. – erdomester

+0

Pourriez-vous s'il vous plaît fournir le code complet et à jour pour votre Widget et votre fournisseur afin que je puisse jouer avec. –

0

Pouvez-vous ajouter ce drapeau

PendingIntent configPendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_ONE, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Vérifiez également Logcat pour toute exception, il jette lorsque vous cliquez sur le widget.

+0

J'ai cliqué sur le widget.Logcat dit: Démarrage de l'activité .... OK. J'ai changé de langue dans l'émulateur. Puis j'ai cliqué sur le widget et rien ne se passe (comme dans mon téléphone). Logcat ne dit rien en cliquant sur le widget cette fois. – erdomester

Questions connexes