2014-02-10 26 views
0

我正在做一个主屏幕小部件,它必须根据用户点击的小部件做不同的事情。为了实现这一点,我使用setOnClickPendingIntent 5次,但只有最后一次调用起作用。我如何为我的小部件中的点击事件设置5个不同的意图?如何设置多个onclickpendingintents到一个小部件?

package bembibre.coolstar.windowsmobilewidget; 

import java.util.Calendar; 

import bembibre.coolstar.windowsmobilewidget.backend.CalendarProvider; 
import bembibre.coolstar.windowsmobilewidget.backend.CallsProvider; 
import bembibre.coolstar.windowsmobilewidget.backend.DateProvider; 
import bembibre.coolstar.windowsmobilewidget.backend.MissedCallsContentObserver; 
import bembibre.coolstar.windowsmobilewidget.backend.Provider; 
import bembibre.coolstar.windowsmobilewidget.backend.SmssContentObserver; 
import bembibre.coolstar.windowsmobilewidget.backend.SmssProvider; 
import bembibre.coolstar.windowsmobilewidget.backend.WhatsappProvider; 
import bembibre.coolstar.windowsmobilewidget.backend.alarms.AlarmSetter; 

import android.app.IntentService; 
import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.CallLog.Calls; 
import android.widget.RemoteViews; 
import android.widget.Toast; 

public class ExtendedAppWidgetProvider extends AppWidgetProvider{ 
private MissedCallsContentObserver mcco; 
private SmssContentObserver smsco; 
private static final String WIDGET_CLICK = "element"; 

/** 
* Llama a la clase AlarmManager de Android para indicarle que esta aplicación 
* debe ser ejecutada automáticamente en la próxima medianoche. Como este 
* widget contiene la fecha (día, mes y año), cada vez que sea medianoche 
* debe ser ejecutado para que se actualice y cambie de día. 
*/ 
public static void setDayChangeAlarm(Context context){ 
    AlarmSetter alarmSetter = new AlarmSetter(context); 
    Calendar when = Calendar.getInstance(); 
    when.roll(Calendar.DAY_OF_MONTH, 1); 
    when.set(Calendar.HOUR, 0); 
    when.set(Calendar.HOUR_OF_DAY, 0); 
    when.set(Calendar.MINUTE, 0); 
    when.set(Calendar.SECOND, 0); 
    when.set(Calendar.MILLISECOND, 0); 
    alarmSetter.setAlarm(when); 
} 

@Override 
public void onEnabled(Context context){ 
    super.onEnabled(context); 
    setDayChangeAlarm(context); 

    WhatsappProvider provider = new WhatsappProvider(context); 
    provider.mDbHelper.open(); 
    provider.resetNoMessagesField(); 
    provider.mDbHelper.close(); 

    this.mcco = new MissedCallsContentObserver(context); 
    context.getContentResolver().registerContentObserver(Calls.CONTENT_URI, true, this.mcco); 

    this.smsco = new SmssContentObserver(context); 
    context.getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, this.smsco); 

    Toast.makeText(context, "Widget iniciado", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onDisabled(Context context){ 
    if(this.mcco != null){ 
     context.getContentResolver().unregisterContentObserver(this.mcco); 
    } 
    if(this.smsco != null){ 
     context.getContentResolver().unregisterContentObserver(this.smsco); 
    } 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction() == null) { 
     new SmssProvider(context).setData(); 

     Bundle extras = intent.getExtras(); 
     if(extras != null){ 
      int element = extras.getInt(WIDGET_CLICK); 
      switch(element){ 
       case R.id.widget_date: 
        Toast.makeText(context, "DATE", Toast.LENGTH_SHORT).show(); 
        break; 

       case R.id.widget_whatsapp: 
        Toast.makeText(context, "WHATSAPP", Toast.LENGTH_SHORT).show(); 
        break; 

       case R.id.widget_calendar: 
        Toast.makeText(context, "CALENDAR", Toast.LENGTH_SHORT).show(); 
        break; 

       case R.id.widget_calls: 
        Toast.makeText(context, "CALLS", Toast.LENGTH_SHORT).show(); 
        break; 

       case R.id.widget_messages: 
        Toast.makeText(context, "MESSAGES", Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    } else { 
     super.onReceive(context, intent); 
    } 
} 

@Override 
public void onUpdate(Context context, AppWidgetManager 
appWidgetManager, int[] appWidgetIds) { 
    context.startService(new Intent(context, 
    ListItemClickService.class)); 

    setDayChangeAlarm(context); 

    /* 
    * Para evitar que se muestren eventos del calendario que 
    * comienzan en una fecha ya pasada, los actualizamos cada vez 
    * que pase un cierto periodo de tiempo y se llame a este 
    * método, onUpdate. 
    */ 
    new CalendarProvider(context).setData(); 

    /* 
    * Para evitar que en la parte de mensajes SMS se muestren mensajes ya 
    * leídos, la actualizamos periódicamente. 
    */ 
    new SmssProvider(context).setData(); 
} 

// TODO Hacer que no pueda haber más de una instancia de este IntentService 
// ejecutándose a la vez. 
public static class ListItemClickService extends IntentService { 
    public ListItemClickService() { 
     super("ExtendedAppWidgetProvider$ListItemClickService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     ComponentName me = new ComponentName(this, ExtendedAppWidgetProvider.class); 
     AppWidgetManager mgr = AppWidgetManager.getInstance(this); 
     mgr.updateAppWidget(me, buildUpdate(this)); 
    } 

    private void setOnClickPendingIntent(RemoteViews updateViews, int element, 
     Context context){ 

     Intent i = new Intent(this, ExtendedAppWidgetProvider.class); 
     i.putExtra(WIDGET_CLICK, element); 

     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
     updateViews.setOnClickPendingIntent(element, pi); 
    } 

    private RemoteViews buildUpdate(Context context) { 
     RemoteViews updateViews = new 
     RemoteViews(context.getPackageName(), R.layout.widget_list); 

     Provider dateProvider = new DateProvider(context); 
     WhatsappProvider whatsappProvider = new WhatsappProvider(context); 
     Provider calendarProvider = new CalendarProvider(context); 
     Provider callsProvider = new CallsProvider(context); 
     Provider smssProvider = new SmssProvider(context); 

     updateViews.setTextViewText(R.id.date, dateProvider.getText()); 
     updateViews.setTextViewText(R.id.whatsapp, whatsappProvider.getSpannedText()); 
     updateViews.setTextViewText(R.id.calendar, calendarProvider.getText()); 
     updateViews.setTextViewText(R.id.calls, callsProvider.getText()); 
     updateViews.setTextViewText(R.id.messages, smssProvider.getText()); 

     this.setOnClickPendingIntent(updateViews, R.id.widget_date, context); 
     this.setOnClickPendingIntent(updateViews, R.id.widget_whatsapp, context); 
     this.setOnClickPendingIntent(updateViews, R.id.widget_calendar, context); 
     this.setOnClickPendingIntent(updateViews, R.id.widget_calls, context); 
     this.setOnClickPendingIntent(updateViews, R.id.widget_messages, context); 

     return updateViews; 
    } 
} 
} 

回答

0

我如何设置点击事件5个不同的意图在我的窗口小部件?

最简单的解决方案是你的getBroadcast()调用的第二个参数提供不同的值,所以你有五种不同PendingIntentsgetBroadcast()(和getActivity()getService())只会创建一个新的PendingIntent,如果还没有,则在您的情况下,您的第一个getBroadcast()调用会创建它。

+0

谢谢,它的工作! – user3289695

相关问题