2011-11-26 13 views
5

Estoy jugando alrededor de la construcción de un nuevo widget y estaba mirando el Android app widget documentation, en particular la sección en la que las clases de widgets fueron compatibles. Me di cuenta de que ViewFlipper es compatible, pero estoy luchando para encontrar algún ejemplo sobre cómo usar uno en un widget de pantalla de inicio. En particular, me pregunto si es posible activar manualmente el intercambio de vistas. En una actividad esto parece relativamente sencillo, un ejemplo es conectar el oyente onclick de un botón para llamar al showNext() de la aleta.ViewFlipper en widgets de aplicación

El objeto RemoteViews tiene los métodos showNext y showPrevious, pero no estoy seguro de entender cómo conectarlos a un evento disparado por el usuario que interactúa con el widget. ¿Alguien puede dar ejemplos de cuándo se pueden llamar estos métodos?

Parece que los botones de los widgets solo se pueden conectar a los intentos en lugar de codificar para ejercitar la aleta. Si esta restricción es verdadera, entonces ¿es el único uso de un flipper de vista en un widget de aplicación para voltear automáticamente las vistas?

Respuesta

8

Supongamos que tiene 2 botones: IZQUIERDA y DERECHA. . En primer lugar se unirían intención pendiente para cada uno (en este caso se desencadenó a partir 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; 
} 

Luego, en AppWidgetProvider hacer

@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); 
} 

Esto debe hacerlo Ahora el problema es - esto sólo funcionará en la API 11+ y acabo de encontrar la manera difícil que root.setInt(R.id.scroll, "setDisplayedChild", pos) no funcionará en API 7.

+0

Fantástica respuesta, muchas gracias. Desafortunadamente, mi aplicación es API 7+, así que tendré que esperar un tiempo antes de poder probar lo anterior, pero abre algunas realmente en tearing posibilidades con mis widgets. Gracias por compartir. –

+0

Tuve que lidiar con el mismo problema y terminé teniendo solo LinearLayout con TextView e ImageView y luego, cuando usted detecta el evento de navegación simplemente cambia los valores. Sin efectos deslizantes extravagantes, pero lo suficientemente bueno – Bostone

+1

Cuando agrego animación en él, el widget de mi aplicación no funciona. ¿Hay alguna manera de hacer que un widget de aplicación de inicio funcione con animaciones? ' ' –