2013-02-10 15 views
32

Mam widget na Androida, który pobiera dane z serwera co 10 minut i wyświetla je na ekranie.
Chciałbym dodać do tego widżetu przycisk "Odśwież".
Gdy użytkownik kliknie ten przycisk, chciałbym uruchomić metodę pobierającą informacje z serwera.
Dodawanie obsługi zdarzeń do przycisku w aplikacji jest bardzo proste, ale nie mogłem znaleźć przykładu widżetu.
Chciałbym uzyskać pomoc dotyczącą dodawania funkcji do kliknięcia przycisku w widgecie.Zdarzenie kliknięcia przycisku dla widgetu Android

+1

To jest pomocne http://stackoverflow.com/a/8635715/2015318 – StarsSky

Odpowiedz

39

dowiedziałem się, jak to zrobić.
dodać akcję do pliku AndroidManifest.xml w tagu><receiver><intent-filter>:

<action android:name="MY_PACKAGE_NAME.WIDGET_BUTTON" /> 

W dostawcy dodać stałą, która odpowiada nazwie Działanie:

public static String WIDGET_BUTTON = "MY_PACKAGE_NAME.WIDGET_BUTTON"; 

W metodzie onUpdate() doda intencję, że pasuje do akcji:

Intent intent = new Intent(WIDGET_BUTTON); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
views.setOnClickPendingIntent(R.id.MY_BUTTON_ID, pendingIntent); 

Wreszcie, w metodzie onRecieve() sprawdź nazwę akcji :

if (WIDGET_BUTTON.equals(intent.getAction())) { 
//your code here 

    } 
+0

Dziękuję bardzo! –

+0

Dzięki @Sharon Haim Pour! –

+1

Myślę, że warto zauważyć, że możesz (i prawdopodobnie powinieneś) użyć wyraźnej intencji zamiast domyślnej intencji. Oznacza to, że nie musisz definiować akcji w manifeście i że powinieneś stworzyć takie intencje jak: Intent intent = new Intent (context, MyClass.class); – user936580

9
protected PendingIntent getPendingSelfIntent(Context context, String action) { 
    Intent intent = new Intent(context, getClass()); 
    intent.setAction(action); 
    return PendingIntent.getBroadcast(context, 0, intent, 0); 
} 

views.setOnClickPendingIntent(R.id.Timm, getPendingSelfIntent(context, 
           "ham")); 

preferują także adres URL:

How to correctly handle click events on Widget

Jeśli rozwiązać go w inny sposób, proszę podać to jako odpowiedź

+1

Nie rozumiem, gdzie umieścić ten kod. Gdzie wywołujesz funkcję w kliknięciu? –

59

Oto przykład bardziej, że powinno pomóc:

package com.automatic.widget; 

import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.RemoteViews; 

public class Widget extends AppWidgetProvider { 

    private static final String SYNC_CLICKED = "automaticWidgetSyncButtonClick"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     RemoteViews remoteViews; 
     ComponentName watchWidget; 

     remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     watchWidget = new ComponentName(context, Widget.class); 

     remoteViews.setOnClickPendingIntent(R.id.sync_button, getPendingSelfIntent(context, SYNC_CLICKED)); 
     appWidgetManager.updateAppWidget(watchWidget, remoteViews); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     super.onReceive(context, intent); 

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

      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

      RemoteViews remoteViews; 
      ComponentName watchWidget; 

      remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
      watchWidget = new ComponentName(context, Widget.class); 

      remoteViews.setTextViewText(R.id.sync_button, "TESTING"); 

      appWidgetManager.updateAppWidget(watchWidget, remoteViews); 

     } 
    } 

    protected PendingIntent getPendingSelfIntent(Context context, String action) { 
     Intent intent = new Intent(context, getClass()); 
     intent.setAction(action); 
     return PendingIntent.getBroadcast(context, 0, intent, 0); 
    } 
} 
+2

Dzięki za tak dobry przykład Używam tego kodu i mojej aplikacji Praca w porządku ... Thnks a Lot –

+0

Dziękuję za tonę, ta odpowiedź pomogła mi. =) –

+1

Ten kod działał bez zamieszania inne przykłady przedstawione - jest to doskonały, zwięzły przykład informacji przewodnika dev - dzięki! – headscratch

7

Oto kolejna odpowiedź z następujących świadczeń:

  • Obsługuje wszystkie instancje App Widget (użytkownik może mieć wiele instancji widgetu w różnych konfiguracjach/rozmiarach na ekranie). Kodowanie dla wszystkich wystąpień jest zgodne z oficjalną dokumentacją. Zobacz Guide > App Widgets > Using the AppWidgetProvider Class, przewiń w dół do przykładu kodu "ExampleAppWidgetProvider".
  • Kod roboczy w onReceive w wywołaniach wywołań onUpdate (w ten sposób zmniejsza się duplikowanie kodu).
  • Kod w onUpdate(Context context) jest uogólniony, aby można go było umieścić w dowolnej podklasie AppWidgetProvider.

Kod:

public class MyWidget extends AppWidgetProvider { 

    private static final String ACTION_UPDATE_CLICK = 
       "com.example.myapp.action.UPDATE_CLICK"; 

    private static int mCount = 0; 

    private static String getMessage() { 
     return String.valueOf(mCount++); 
    } 

    private PendingIntent getPendingSelfIntent(Context context, String action) { 
     // An explicit intent directed at the current class (the "self"). 
     Intent intent = new Intent(context, getClass()); 
     intent.setAction(action); 
     return PendingIntent.getBroadcast(context, 0, intent, 0); 
    } 

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

     String message = getMessage(); 

     // Loop for every App Widget instance that belongs to this provider. 
     // Noting, that is, a user might have multiple instances of the same 
     // widget on 
     // their home screen. 
     for (int appWidgetID : appWidgetIds) { 
      RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
                 R.layout.my_widget); 

      remoteViews.setTextViewText(R.id.textView_output, message); 
      remoteViews.setOnClickPendingIntent(R.id.button_update, 
               getPendingSelfIntent(context, 
                  ACTION_UPDATE_CLICK) 
      ); 

      appWidgetManager.updateAppWidget(appWidgetID, remoteViews); 

     } 
    } 

    /** 
    * A general technique for calling the onUpdate method, 
    * requiring only the context parameter. 
    * 
    * @author John Bentley, based on Android-er code. 
    * @see <a href="http://android-er.blogspot.com 
    * .au/2010/10/update-widget-in-onreceive-method.html"> 
    * Android-er > 2010-10-19 > Update Widget in onReceive() method</a> 
    */ 
    private void onUpdate(Context context) { 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance 
       (context); 

     // Uses getClass().getName() rather than MyWidget.class.getName() for 
     // portability into any App Widget Provider Class 
     ComponentName thisAppWidgetComponentName = 
       new ComponentName(context.getPackageName(),getClass().getName() 
     ); 
     int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
       thisAppWidgetComponentName); 
     onUpdate(context, appWidgetManager, appWidgetIds); 
    } 

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

     if (ACTION_UPDATE_CLICK.equals(intent.getAction())) { 
      onUpdate(context); 
     } 
    } 

} 

Widget wygląda to

Widget update button example. Simple counting.

ten buduje na getPendingSelfIntent pracy @Kels, @SharonHaimPour i @ Erti-ChrisEelmaa.

To także opiera się na Android-er > 2010-10-19 > Update Widget in onReceive() method (nie ja), gdzie pokazano, jak wywołać onUpdate z onReceive, na podstawie instancji aplikacji. Tworzę ten kod ogólny i zawijam go w callOnUpdate.

Powiązane problemy