Android Widget按钮

问题描述

| 在本教程中,我创建了带有按钮的小部件。在下面的代码中,当我单击ButtonP1时,会看到吐司味精。我也尝试对ButtonP2执行相同的操作,但是只能看到一个Toast msg设置为ButtonP1。当用户单击ButtonP2时,如何显示一个吐司味精?
    public class HelloWidget extends appwidgetprovider {

    public static String ACTION_WIDGET_CONfigURE = \"ConfigureWidget\";
    public static String ACTION_WIDGET_RECEIVER = \"ActionReceiverWidget\";

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

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

         Intent active = new Intent(context,HelloWidget.class);
         active.setAction(ACTION_WIDGET_RECEIVER);
         active.putExtra(\"msg\",\"Message for Button P1\");

         PendingIntent actionPendingIntent = PendingIntent.getbroadcast(context,active,0);
         remoteViews.setonClickPendingIntent(R.id.ButtonP1,actionPendingIntent);

         Intent active2 = new Intent(context,HelloWidget.class);
         active2.setAction(ACTION_WIDGET_RECEIVER);
         active2.putExtra(\"msg\",\"Message for Button P2\");

         PendingIntent actionPendingIntent2 = PendingIntent.getbroadcast(context,active2,0);
         remoteViews.setonClickPendingIntent(R.id.ButtonP2,actionPendingIntent2);

         appWidgetManager.updateAppWidget(appWidgetIds,remoteViews);
   }

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

    final String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) 
    {
        final int appWidgetId = intent.getExtras().getInt(
                AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
        if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) 
        {
            this.onDeleted(context,new int[] { appWidgetId });
        }
    } 
    else 
    {
        if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) 
        {
            String msg = \"null\";
            try {
                msg = intent.getStringExtra(\"msg\");
                } catch (NullPointerException e) {
                Log.e(\"Error\",\"msg = null\");
                }
                Toast.makeText(context,\"Out: \" + msg,Toast.LENGTH_SHORT).show();
        }
        super.onReceive(context,intent);
    }
}
}
我已经尝试过这个(ACTION_WIDGET_RECEIVER2而不是ACTION_WIDGET_RECEIVER)
Intent active2 = new Intent(context,HelloWidget.class);
     active2.setAction(ACTION_WIDGET_RECEIVER2);
     active2.putExtra(\"msg\",\"Message for Button P2\");

     PendingIntent actionPendingIntent2 = PendingIntent.getbroadcast(context,0);
     remoteViews.setonClickPendingIntent(R.id.ButtonP2,actionPendingIntent2);
if (intent.getAction().equals(ACTION_WIDGET_RECEIVER2)) 
                {
                    String msg2 = \"null\";
                    try {
                        msg2 = intent.getStringExtra(\"msg2\");
                        } catch (NullPointerException e) {
                        Log.e(\"Error\",\"msg = null\");
                        }
                        Toast.makeText(context,\"Out2: \" + msg2,Toast.LENGTH_SHORT).show(); //null
                }
在相同的if行之后。在这种情况下,msg2变量为null。     

解决方法

        检索将执行广播的PendingIntent时,必须使用不同的请求代码。如果不是,则
PendingIntent.getBroadcast(..)
会根据您的情况返回一个已有的,并带有您的第一个Intent的消息。
private static final int REQUEST_CODE_ONE = 10;
private static final int REQUEST_CODE_TWO = 20;

....

@Override
public void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) {
    ....
    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context,REQUEST_CODE_ONE,active,0);
    ....

    PendingIntent actionPendingIntent2 = PendingIntent.getBroadcast(context,REQUEST_CODE_TWO,active2,0);
    ....
}