2011-11-26 12 views
5

Rozgrywam wokół tworzenia nowego widżetu i przyglądam się Android app widget documentation, w szczególności sekcji dotyczącej obsługiwanych klas widgetów. Zauważyłem, że obsługiwana jest obsługa ViewFlipper, ale staram się znaleźć przykłady użycia jej w widżecie ekranu głównego. W szczególności zastanawiam się, czy możliwe jest ręczne wywoływanie widoków zamiany. W działaniu wygląda to dość prosto, jednym z przykładów jest podłączenie detektora onclick przycisku, który wywołuje funkcję showNext() flippera.ViewFlipper w widżetach aplikacji

Obiekt RemoteViews ma metody showNext i showPrevious, ale nie jestem pewien, czy rozumiem, jak podłączyć je do zdarzenia wywołanego od użytkownika wchodzącego w interakcję z widżetem. Czy ktokolwiek może podać przykłady tego, kiedy można wywołać te metody?

Wygląda na to, że przyciski w widżetach można podłączać tylko do celów, a nie do kodu, aby wykonywać ruchy płetwami. Jeśli to ograniczenie jest prawdziwe, to czy jedynym zastosowaniem flippera widoku w widżecie aplikacji jest automatyczne odwracanie widoków?

Odpowiedz

8

Załóżmy, że masz dwa przyciski: LEWO i PRAWO. . Po pierwsze byłoby dołączyć oczekiwaniu zamiar każda (tutaj to wywołane z Service#onStart:

@Override 
public void onStart(Intent intent, int startId) { 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext()); 
    int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 
    // add listeners for every widget registered 
    for (int widgetId : allWidgetIds) { 
     addClickListeners(appWidgetManager, widgetId, root); 
    } 
    stopSelf(); 
} 

protected void addClickListeners(AppWidgetManager appWidgetManager, int widgetId, RemoteViews root) { 
    root.setOnClickPendingIntent(R.id.left, getNavigationIntent(widgetId, R.id.left)); 
    root.setOnClickPendingIntent(R.id.right, getNavigationIntent(widgetId, R.id.right)); 
} 

protected PendingIntent getNavigationIntent(int widgetId, final int id) { 
    Intent clickIntent = new Intent(this, WidgetProvider.class); 
    clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
    clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
    clickIntent.putExtra(TRIGGER, id); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    return pendingIntent; 
} 

Następnie w AppWidgetProvider zrobić

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    Bundle extras = intent.getExtras(); 
    Integer id = (Integer) (extras == null ? null : extras.get(TRIGGER)); 
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action) && id != null) { 
     int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); 
     onNavigate(context, widgetId, id); 
    } else { 
     super.onReceive(context, intent); 
    } 
} 


protected void onNavigate(Context context, Integer widgetId, Integer id) { 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    RemoteViews root = new RemoteViews(context.getPackageName(), R.layout.app_widget); 
    if (id == R.id.left) { 
     root.showPrevious(R.id.scroll); 
    } else { 
     root.showNext(R.id.scroll);    
    } 
    appWidgetManager.updateAppWidget(widgetId, root); 
} 

To powinno wystarczyć Teraz jest problem - to będzie działać tylko w API 11+ i właśnie znalazłem twardy sposób, że root.setInt(R.id.scroll, "setDisplayedChild", pos) nie zadziała w API 7.

+0

Fantastyczna odpowiedź, dziękuję bardzo. Niestety moja aplikacja to API 7+, więc będę musiał trochę poczekać, zanim spróbuję powyższe, ale to naprawdę otwiera niektóre Ciekawe możliwości dzięki moim widgetom. Dziękuję za udostępnienie. –

+0

Musiałem poradzić sobie z tym samym problemem i skończyłem właśnie z jednym LinearLayout z TextView i ImageView, a następnie po wykryciu zdarzenia nawigacyjnego po prostu zmienić wartości. Żadnych wymyślnych efektów przesuwnych, ale wystarczająco dobre. – Bostone

+1

Po dodaniu animacji mój widget aplikacji nie działa. Czy istnieje sposób na sprawienie, aby widżet aplikacji domowej przerzucał się z animacjami? ' ' –

Powiązane problemy