2014-02-10 4 views
1

Когда я добавляю свой виджет со страницы виджетов на своем телефоне, он воспроизводит тост-сообщение «Button Clicked». Тост должен отображаться только после нажатия кнопки, и он работает, но он также отображается, когда виджет добавляется на экран.Кнопка Android Widget Click On Добавить

Я предполагаю, что это может иметь отношение к супер, но Я не совсем уверен.

Код:

 @Override 
     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]; 

       Intent intent = new Intent(context, Provider.class); 
       intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

       RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
       views.setOnClickPendingIntent(R.id.onoffbutton, pendingIntent); 

       appWidgetManager.updateAppWidget(appWidgetId, views); 
      } 
     } 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       super.onReceive(context, intent); 
       if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE)) { 
        Toast.makeText(context, "Button Clicked", Toast.LENGTH_SHORT).show(); 
        System.out.println("Click!"); 
        } 

      } 

EDIT:

public static String BUTTON_CLICK = "android.appwidget.action.BUTTON_CLICK"; 


     @Override 
     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]; 

       Intent intent = new Intent(context, Provider.class); 
       intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
       Intent clickIntent = new Intent(context, Provider.class); 
       clickIntent.setAction(BUTTON_CLICK); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

       RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
       views.setOnClickPendingIntent(R.id.onoffbutton, pendingIntent); 

       appWidgetManager.updateAppWidget(appWidgetId, views); 
      } 
     } 
      @Override 
      public void onReceive(Context context, Intent clickIntent) { 
       super.onReceive(context, clickIntent); 
       if (clickIntent.getAction().equals(BUTTON_CLICK)) { 
        Toast.makeText(context, "Button Clicked", Toast.LENGTH_SHORT).show(); 
        System.out.println("Click!"); 
        } 

      } 

ответ

2

Это потому, что у вас есть те же действия для обновления

виджета Сделайте отдельный пристальный действие для кнопки (BTN_ACTION, например). В onReceive() проверьте, у кого i = намерение действия, и если намерение.getAction() равно (BTN_ACTION) - нажмите кнопку управления кнопкой.

+0

Исправлено, забыл изменить намерение в PendingIntent pendingIntent = PendingIntent.getBroadcast (контекст, 0, намерение, 0); щелкнуть мышью. –

+1

Да, справа. Таким образом, вы сделали отдельную кнопку PendingIntent для кнопки и назначили задержку срабатывания вашего намерения (тот, который вы предоставляете PendingIntent). Поэтому, когда кнопка нажата, это намерение запускается и возвращается в метод onReceive(). Система Intent в Android чрезвычайно мощная – Sam

Смежные вопросы