2010-05-01 12 views
59

Parece que la documentación del desarrollador me ha fallado aquí. Puedo crear un widget estático sin pensarlo, incluso puedo crear un widget como el widget de reloj analógico que se actualizará a sí mismo, sin embargo, no puedo imaginar cómo crear un widget que reaccione cuando un usuario haga clic en eso. Aquí es el mejor ejemplo de código que la documentación para desarrolladores da a lo que una actividad artilugios deben contener (el único otro indicio siendo las demostraciones del API, que sólo crea un widget estática):widgets que se pueden hacer clic en Android

public class ExampleAppWidgetProvider extends AppWidgetProvider { 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      // Create an Intent to launch ExampleActivity 
      Intent intent = new Intent(context, ExampleActivity.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

      // Get the layout for the App Widget and attach an on-click listener to the button 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout); 
      views.setOnClickPendingIntent(R.id.button, pendingIntent); 

      // Tell the AppWidgetManager to perform an update on the current App Widget 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 
} 

de: The Android Developer Documentation's Widget Page

Entonces, parece que se llama intención pendiente cuando se hace clic en el widget, que se basa fuera de un intento (no estoy muy seguro de cuál es la diferencia entre un intento y un intento pendiente), y la intención es para la clase ExampleActivity . Así que hice mi clase de actividad muestra una actividad simple que cuando se creó, crearía un objeto MediaPlayer, y empezar a ella (no sería jamás liberar el objeto, por lo que sería finalmente estrellarse, aquí es su código:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound); 
    mp.start(); 
} 

Sin embargo, cuando agregué el widget a la pantalla de inicio y hice clic en él, no jugué nada, de hecho, no jugué nada cuando configuré el temporizador de actualización en solo unos cientos de milisegundos (en el archivo xml del proveedor de appwidget). Además, establecí los puntos de quiebre y descubrí que no solo nunca llegaba a la actividad, sino que ningún punto de quiebre que establecí se disparaba (todavía no he descubierto por qué), sin embargo, logcat parecía indicar que la clase de actividad el archivo se estaba ejecutando.

Entonces, ¿hay algo que pueda hacer para que un appwidget responda a un clic? Como el método onClickPendingIntent() es el más cercano que he encontrado a un tipo de método onClick.

Muchas gracias.

+0

Hai Leif, ¿resuelve este problema con el Methode de Brain515? Tengo un problema similar, pero la solución del cerebro no funciona para mí. ¿Puedes ayudarme? –

Respuesta

124

Primero, agregue una variable estática con una constante.

public static String YOUR_AWESOME_ACTION = "YourAwesomeAction"; 

Luego hay que agregar la acción a la intención antes de agregar la intención de la intención pendientes:

Intent intent = new Intent(context, widget.class); 
intent.setAction(YOUR_AWESOME_ACTION); 

(Donde widget.class es la clase de su AppWidgetProvider, su clase actual)

a continuación, deberá crear un PendingIntent con getBroadcast

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

Establecer la onClickPendingIntent para la vista se puede hacer clic en el widget

remoteView.setOnClickPendingIntent(R.id.widgetFrameLayout, pendingIntent); 

A continuación, reemplazar el método OnReceive en la misma clase:

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

Y luego responder a las pulsaciones de botón mediante la consulta de la intención devuelto para su acción dentro del método onReceive:

if (intent.getAction().equals(YOUR_AWESOME_ACTION)) { 
    //do some really cool stuff here 
} 

¡Y eso debería hacerlo!

+1

donde esta línea (Intent intennt = new Intent (context, ExampleActivity.class);) is place? ¿Qué hace el widget?clase contiene? Supongo que ExampleActivity es lo que queremos lanzar – JustCurious

+1

Editado la respuesta a un método de algunos pasos adicionales que se necesitan para que esto funcione. El getBroadcast es importante para la transmisión de PendingIntent, en lugar de getActivity del ejemplo. – Guykun

+0

¿Por qué PendingIntent.getBroadcast vs PendingIntent.getActivity? –

Cuestiones relacionadas