Sto provando a fare qualcosa che dovrebbe essere abbastanza semplice, ma mi sta facendo impazzire. Sto tentando di avviare un'attività quando viene premuto un widget della schermata iniziale, ad esempio un'attività di configurazione per il widget. Penso di aver seguito parola per parola il tutorial sul sito web degli sviluppatori Android e anche qualche tutorial non ufficiale, ma mi manca qualcosa di importante in quanto non funziona.Avvio dell'attività dal widget
Ecco il codice:
public class VolumeChangerWidget extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
final int N = appWidgetIds.length;
for (int i=0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Log.d("Steve", "Running for appWidgetId " + appWidgetId);
Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT);
Log.d("Steve", "After the toast line");
Intent intent = new Intent(context, WidgetTest.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
Quando si aggiunge il widget per la homescreen, Logcat mostra le due linee di debug, anche se non la Toast. (Qualche idea, perché no?) Tuttavia, più fastidio è che quando faccio clic sul pulsante con il PendingIntent ad esso associato, non accade nulla. So che l'attività "WidgetTest" può essere eseguita perché se si imposta un Intent dall'attività principale, viene avviato correttamente.
Nel caso in cui le cose, qui è il file manifest di Android:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.steve"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Volume_Change_Program"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".WidgetTest"
android:label="@string/hello">
<intent_filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent_filter>
</activity>
<receiver android:name=".VolumeChangerWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/volume_changer_info" />
</receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
C'è un modo per testare in cui la colpa è? Cioè è il difetto che il pulsante non è collegato correttamente a PendingIntent o che PendingIntent o Intent non sta trovando WidgetTest.class, ecc.?
Grazie mille per il vostro aiuto!
Steve
Purtroppo no, non ho ancora capito come farlo. Deve essere qualcosa di oscuro, come te leggi tutti i tutorial che ho trovato, ma non ho mai trovato qualcosa che funzionasse. Ho appena finito di accantonare questo progetto e ho iniziato a lavorare su qualcos'altro fino a quando non sapessi come usare Android un po 'meglio. –
Ehi, Steve. Penso di aver scoperto la soluzione. Sto sviluppando su 2.0.1. La chiave stava spostando questo codice esatto in onUpdated e poi chiamando una cosa aggiuntiva: un riferimento ad AppWidgetManager arriva a onUpdated tramite i parametri. ComponentName comp = new ComponentName (context.getPackageName(), ToggleWidget.class.getName()); appWidgetManager.updateAppWidget (comp, visualizzazioni); Questa versione dice di aggiornare tutte le istanze del widget come questo. Unico problema ora consiste nell'effettuare la chiamata onEnabled suUpUpdate una volta, in modo tale che si trovi quando l'utente aggiunge widget a casa. – mylock
+1 grazie. aggiungendo mgr.updateAppWidget ho potuto finalmente ottenere il mio widget per fare lo stesso. – nategood