Domanda

Sto cercando di fare qualcosa che in realtà dovrebbe essere abbastanza facile, ma è facendo impazzire. Sto cercando di avviare un'attività quando viene premuto un widget schermata iniziale, come ad esempio attività di configurazione per il widget. Credo di aver seguito parola per parola il tutorial sul sito Android Developers, e anche un paio di tutorial non ufficiali come pure, ma devo essere perso qualcosa importante in quanto non funziona.

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. (Tutte le idee perché no?) Tuttavia, più fastidioso è che quando poi clicca sul pulsante con il PendingIntent ad esso associati, non succede niente affatto. So che l'attività "WidgetTest" può essere eseguito perché se ho creato un Intent dall'interno l'attività principale, si lancia bene.

Nel caso in cui conta, 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 al PendingIntent, o che il PendingIntent o l'intento non è trovare WidgetTest.class, etc?

Grazie mille per il vostro aiuto!

Steve

È stato utile?

Soluzione

ho avuto lo stesso problema. Ho scoperto che la correzione è quello di chiamare un aggiornamento tramite il gestore AppWidget. ecco un esempio di come farlo in onEnabled. Sembra che deve essere fatto sia in onEnabled e onUpdated in modo che quando il dispositivo si sta accendendo il vostro scatto intento è anche inizializzata -. In onUpdated i params forniscono già il riferimento al gestore, per fortuna

@Override 
    public void onEnabled(Context context) {  
          //Log.v("toggle_widget","Enabled is being called"); 

          AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
          //retrieve a ref to the manager so we can pass a view update 

          Intent i = new Intent(); 
          i.setClassName("yourdoman.yourpackage", "yourdomain.yourpackage.yourclass"); 
          PendingIntent myPI = PendingIntent.getService(context, 0, i, 0); 
          //intent to start service 

        // Get the layout for the App Widget 
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.togglelayout); 

        //attach the click listener for the service start command intent 
        views.setOnClickPendingIntent(R.id.toggleButton, myPI); 

        //define the componenet for self 
        ComponentName comp = new ComponentName(context.getPackageName(), ToggleWidget.class.getName()); 

        //tell the manager to update all instances of the toggle widget with the click listener 
        mgr.updateAppWidget(comp, views); 
} 

Altri suggerimenti

Portando questa via dai morti, ma ho avuto un problema simile e penso che finalmente ho risolto ... come te, ho avuto un PendingIntent che ho attaccato al RemoteView. A volte che avrebbe funzionato, e, talvolta, fallirebbe. E mi stava facendo impazzire.

Quello che ho trovato da un tooltip sul PendingIntent.getActivty () era:

  

Si noti che l'attività verrà avviata al di fuori del contesto di un'attività già esistente, quindi è necessario utilizzare il lancio di bandiera Intent.FLAG_ACTIVITY_NEW_TASK nell'intento.

così, ho aggiunto:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

No codice di esempio che ho visto fino ad ora fa questo, ma ha risolto il mio problema; l'attività Impostazioni è ora lanciato in modo affidabile.

Il codice completo che sta lavorando bene ...

Intent intent = new Intent(context, Settings.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId);  // Identifies the particular widget...
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Make the pending intent unique...
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.wwwidget);
views.setOnClickPendingIntent(R.id.widget, pendIntent);
appWidgetManager.updateAppWidget(appId,views);

Questo ha funzionato per me, sulla base di informazioni qui, il campione widget di parola, e il tutorial qui

       Intent intent = new Intent(Intent.ACTION_MAIN, null);
      intent.addCategory(Intent.CATEGORY_LAUNCHER);
      // first param is app package name, second is package.class of the main activity
      ComponentName cn = new ComponentName("com....","com...MainActivity");
      intent.setComponent(cn);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      PendingIntent myPI = PendingIntent.getActivity(context, 0, intent, 0); 

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_word); 


    views.setOnClickPendingIntent(R.id.widget, myPI); 

    AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
    mgr.updateAppWidget(comp, views); 

Il problema con il toast non mostrare è facile, non si chiama show (), un errore faccio sempre troppo ... fare

Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT).show();

anziché

Toast.makeText(context, "Hello from onUpdate", Toast.LENGTH_SHORT);

Steve,

Hai trovato il problema? Io uso widget e funziona bene per me senza trucco onEnabled. Mi interessa perché non fa per voi.

La mia ipotesi: nel codice originale riprova

PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, 0);

anziché

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

Quando si aggiunge il widget sul   homescreen, Logcat mostra i due   debug linee, anche se non la Toast.   (Tutte le idee perché no?)

Non tentare di lanciare Toasts da un BroadcastReceiver.

  

C'è un modo per testare in cui il guasto   è?

Guarda LogCat, via adb logcat, DDMS, o la prospettiva DDMS in Eclipse. Si possono trovare gli avvertimenti di non trovare un'attività che corrisponda al dato Intent.

Non vedo alcun problema evidente. Si consiglia di dare uno sguardo a uno dei miei esempi del libro e vedere se funziona per voi, e se ti dà alcuna idea di ciò che può essere in corso di realizzazione.

è necessario definire la vostra attività di configurazione in res / xml / volume_changer_info.xml. Aggiungere questo tag e dare un percorso completo per l'attività di configurazione.

Android: configure = ""


per es.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="200dip"
    android:minHeight="100dip"
    android:updatePeriodMillis="60000"
    android:initialLayout="@layout/widget_loading"
    android:configure = "org.raza.ConfigureWidgetActivity"/>

So che questa discussione è antica, ma ... Altre risposte descrivere il problema toast bruciato. Quanto al motivo per la vostra attività pop-up non viene avviato al tatto, potrebbe essere necessario attivare l'azione di "update" per lanciare e richiamare il metodo onUpdate (). Per questo penso che è necessario aggiungere l'azione "APPWIDGET_UPDATE" come questo:

<activity android:name=".WidgetTest" android:label="@string/hello">
    <intent_filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent_filter>
</activity>

Allo stesso modo aggiungere l'APPWIDGET_ENABLED e le azioni APPWIDGET_DISABLED se avete intenzione di ignorare quei metodi troppo.

Sembra essere un API molto insolito che richiede di dichiarare i metodi override che si desidera chiamare. Il solito modo per ottenere la vostra versione personalizzata di un genitore è quello di ignorare semplicemente / implementarli. Forse c'è una buona ragione per questo strano modello, ma non è un modello Java che ho visto prima. Penso quindi è probabile che inciampare una grande quantità di autori app widget. Come se widget di app non sono state confuse abbastanza senza questo meccanismo.

Un punto in più: l'attività che viene chiamato dal widget deve essere dichiarato nel file manifesto. Nessuna eccezione viene generata, sembra proprio non succede nulla ...

Volevo solo notare che questo qui da qualche parte come mi è stato (abbastanza stupidamente) combattere questo per tutta la notte. Fondamentalmente ho fatto tutto il codice intento correttamente, ma nulla sarebbe stato lanciato.

Il problema era che per sbaglio ho ricevuto una telefonata del genere

super.onUpdate(context, appWidgetManager, appWidgetIds);

alla fine della mia funzione override onUpdate ().

Assicurati di NON hanno questa chiamata a super come sarà chiaro fuori tutti gli effetti in sospeso che hai impostato!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top