2011-10-04 9 views
6

Ho un homescreenwidget in Android con due pulsanti. Entrambi i pulsanti dovrebbero chiamare la stessa attività (classe), basta usare un diverso intento e ulteriori intenti, per sapere quale pulsante ha chiamato la classe. Per ora solo button1 funziona e chiama l'attività. Ricevo anche il valore chiave nell'Attività chiamata.Due pulsanti di widget Android che chiamano stessa attività con intenti diversi

Come posso far funzionare il secondo pulsante? Ecco il mio codice:

   public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    super.onUpdate(context, appWidgetManager, appWidgetIds); 

    for (int i =0; i<appWidgetIds.length ; i++){ 

     int appWidgetId = appWidgetIds[i]; 

     Intent intent2 = new Intent(context, Main.class); 
     Intent intent1 = new Intent(context, Main.class); 

     // Intent put extras Button 1 
     String bread1 = "secure"; 
     Bundle basket1 = new Bundle(); 
     basket1.putString("key", bread1); 
     intent1.putExtras(basket1); 

     // Intent put extras Button 2 
     String bread2 = "insecure"; 
     Bundle basket2 = new Bundle(); 
     basket2.putString("key", bread2); 
     intent2.putExtras(basket2); 

     PendingIntent pending1 = PendingIntent.getActivity(context,0,intent1, 0); 
     PendingIntent pending2 = PendingIntent.getActivity(context, 0, intent2, 0); 

     RemoteViews views1 = new RemoteViews(context.getPackageName(),R.layout.maina); 
     RemoteViews views2 = new RemoteViews(context.getPackageName(),R.layout.maina); 

     views1.setOnClickPendingIntent(R.id.button1, pending1); 
     views2.setOnClickPendingIntent(R.id.button2, pending2); 

     appWidgetManager.updateAppWidget(appWidgetId, views1); 
     appWidgetManager.updateAppWidget(appWidgetId, views2); 

Ecco l'maina.xml

  <?xml version="1.0" encoding="utf-8"?> 
      <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" android:weightSum="1"    android:orientation="vertical"> 
      <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:id="@+id/tvWidget" android:textAppearance="?android:attr/textAppearanceLarge"></TextView> 

      <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" android:weightSum="1" android:orientation="horizontal"> 



      <Button android:text="@string/button1" android:id="@+id/button1" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button> 
      <Button android:text="@string/button2" android:id="@+id/button2" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button> 

      </LinearLayout> 

</LinearLayout> 
+0

Potete fornire ulteriori dettagli su ciò che non funziona per il secondo pulsante? Cioè non sta facendo nulla quando viene cliccato? –

+0

a destra, non sta facendo nulla quando è stato premuto. – Arnold

risposta

12

@Arnold aver creato 2 PendingIntent che sono ....

PendingIntent pending1 = PendingIntent.getActivity(context,0,intent1, 0); 
PendingIntent pending2 = PendingIntent.getActivity(context, 0, intent2, 0); 

Dove PendingIntent.getActivity (contesto Context, int requestCode, intento Intent, int flags) ha 4 parametri. Devi inviare diversi "requestCode" per diversi PendingIntents.

Il codice dovrebbe essere ....

PendingIntent pending1 = PendingIntent.getActivity(context,0,intent1, PendingIntent.FLAG_UPDATE_CURRENT); 
PendingIntent pending2 = PendingIntent.getActivity(context, 1, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 

nella classe principale è necessario per creare questa ...

String value; 
@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 

      Bundle b=intent.getExtras(); 


    try{ 
    value=b.getString("key"); 
    } 
    catch (Exception e) { 
     // TODO: handle exception 
    } 

    super.onReceive(context, intent); 

} 

con il codice onUpdate ....

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    // Get all ids 
    ComponentName thisWidget = new ComponentName(context, 
      main.class); 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

    for (int widgetId : allWidgetIds) { 
     // Create some random data 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.main); 


     // Register an onClickListener for 1st button 
     Intent intent = new Intent(context, main.class); 

     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds); 
     intent.putExtra("key", "1st Button"); 

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

     remoteViews.setOnClickPendingIntent(R.id.button1, pendingIntent); 

     // Register an onClickListener for 2nd button............ 
     Intent intent2 = new Intent(context, main.class); 

      intent2.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
        intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds); 
      intent2.putExtra("key", "2nd Button"); 

     PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 
       1, intent2, PendingIntent.FLAG_UPDATE_CURRENT); 

     remoteViews.setOnClickPendingIntent(R.id.button2, pendingIntent2); 

     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
} 

Quindi è possibile verificare se il valore = 1 ° pulsante o valor e = 2nd Button per sapere quale pulsante è stato cliccato. Dovrebbe funzionare ... se non funziona per favore fatemelo sapere qual è il problema ...

0

vostro widget di avrà solo 1 vista a distanza. Provare a cambiare la fine di snippet di codice a:

RemoteViews remoteView = new RemoteViews(context.getPackageName(),R.layout.maina); 

remoteView.setOnClickPendingIntent(R.id.button1, pending1); 
remoteView.setOnClickPendingIntent(R.id.button2, pending2); 

appWidgetManager.updateAppWidget(appWidgetId, remoteView); 

In mancanza di ciò, sarebbe utile vedere il layout in R.layout.maina.

+0

ho cambiato il codice come hai detto tu. non funziona altrettanto bene. il pulsante2 non ha funzionalità. il pulsante cambia colore quando si fa clic su di esso ma non avvia l'attività desiderata. grazie per il tuo aiuto – Arnold

+0

Scusa Arnold, non riesco a individuare il problema se non segnalare che ti manca un tag ''/LinearLayout> 'nel tuo maina.xml. Tuttavia, sospetto che si tratti di un problema di copia e incolla poiché Eclipse avrebbe dovuto contrassegnarlo come un errore in caso contrario. Buona fortuna (e posta la risposta qui se lo capisci)! –

2

Ho avuto un problema simile con l'utilizzo di 2 pulsanti su un widget. Ho impostato OnClickPendingIntents su entrambi, distinto da diverse chiamate setExtra(). Ma solo il secondo intento è stato chiamato, anche quando si fa clic sul primo pulsante. Ho trovato 2 soluzioni: - assegnare azioni diverse per entrambe le PendingIntents - sul secondo PendingEvent impostare il flag PendingEvent.FLAG_CANCEL_CURRENT

Sono abbastanza familiarità con PendingEvents e widget, quindi non riesco a vedere i pro ei contro e si atterrà alla prima soluzione.

Forse potrebbe aiutarti anche con il tuo problema.

1

Nel mio caso:

remoteViews.setOnClickPendingIntent(R.id.widget_head, touch_man(context)); 

remoteViews.setOnClickPendingIntent (R.id.widget_head2, touch_woman (context));

public static PendingIntent touch_man(Context context) { 

    Intent intent = new Intent(); 
    intent.setAction("touch_man"); 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

} 

public static PendingIntent touch_woman(Context context) { 

    Intent intent = new Intent(); 
    intent.setAction("touch_woman"); 
    return PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

} 

In AndroidManifest

<receiver 
     android:name="Receiver" 
     android:label="widgetBroadcastReceiver" > 
     <intent-filter> 
      <action android:name="touch_man" /> 
      <action android:name="touch_woman"/> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/demo_widget_provider" /> 
    </receiver> 

E 'di lavoro.

Problemi correlati