2016-11-24 2 views
6
public class VWid extends AppWidgetProvider { 

    public static String WIDGET_UPDATE = "WIDGET_UPDATE"; 

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

     if (WIDGET_UPDATE.equals(intent.getAction())) { 
      Toast.makeText(context, "onReceiver()", Toast.LENGTH_LONG).show(); 
     } 
    } 

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     // Perform this loop procedure for each App Widget that belongs to this 
     // provider 
     for (int i = 0; i < N; i++) { 
      int appWidgetId = appWidgetIds[i]; 
      int k, p; 
      SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy hh:mm a"); 

      AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
      int k = audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM); 
      Toast.makeText(getActivity(), k+"", Toast.LENGTH_LONG).show(); 

      Intent imageview2Intent= new Intent(context, VWid.class); 
      PendingIntent pendingIntent2= PendingIntent.getBroadcast(context,0, imageview2Intent,0); 

      views.setOnClickPendingIntent(R.id.imagebuttonrefresh, pendingIntent2); // 

      views.setTextViewText(R.id.textview1, "Last Refresh: " + dateFormat.format(new Date()).toString()); 

      pushWidgetUpdate(context, views); 
     } 
    } 

    public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) { 
     ComponentName myWidget = new ComponentName(context, VWid.class); 
     AppWidgetManager manager = AppWidgetManager.getInstance(context); 
     manager.updateAppWidget(myWidget, remoteViews); 
     Log.d("UPDATED", "testing"); 
    } 
} 

виджета Когда я первый добавить виджет на мой рабочий стол, textview1 дисплеев: Last Refresh: {current date and time}. Он также отображает системный том в тосте.Как вручную вызвать `onUpdate` из самого

Предположим, что я увеличиваю/уменьшаю системный том, когда я нажимаю обновление, функция onUpdate() должна запускать показ обновленного Toast, а также обновлять текст textview1 новым данным и временем, но этого не происходит.

Как я могу изменить код, чтобы я мог достичь обновления, в сущности вызывая функцию onUpdate().

ответ

3

Попробуйте это:

public class WidgetProvider extends AppWidgetProvider { 

public static final String REFRESH_ACTION = "com.packagename.REFRESH_ACTION"; 

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

    if (intent.getAction().equals(WidgetProvider.REFRESH_ACTION)) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS); 

      if (appWidgetIds != null && appWidgetIds.length > 0) { 
       Toast.makeText(context, "REFRESH", Toast.LENGTH_SHORT).show(); 
       this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds); 
      } 
     } 
    } 

} 


@Override 
public void onUpdate(final Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    final int N = appWidgetIds.length; 


    for (int i = 0; i < N; ++i) { 

     RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

     Intent intentServiceCall = new Intent(context, WidgetService.class); 
     intentServiceCall.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); 

    //Refresh 
     Intent refreshIntent = new Intent(context, WidgetProvider.class); 
     refreshIntent.setAction(WidgetProvider.REFRESH_ACTION); 
     refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 
     intentServiceCall.setData(Uri.parse(intentServiceCall.toUri(Intent.URI_INTENT_SCHEME))); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     rv.setOnClickPendingIntent(R.id.ivRefreshWidget, pendingIntent); 

    appWidgetManager.updateAppWidget(appWidgetIds[i], rv); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 
+0

Это похоже на то, что я закончил делать. Спасибо. +1 для ответа. – Si8

1

Изменить этот раздел:

Intent imageview2Intent= new Intent(context, VWid.class); 
imageview2Intent.setAction(WIDGET_UPDATE); 
PendingIntent pendingIntent2= PendingIntent.getBroadcast(context,0, imageview2Intent,0); 
views.setOnClickPendingIntent(R.id.imagebuttonrefresh, pendingIntent2); // 


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

    if (WIDGET_UPDATE.equals(intent.getAction())) { 
     pushWidgetUpdate(context); 
    } 
} 
+0

У меня есть AppWidgetProvider и BroadcastReceiver для обработки щелчков кнопок. Где я могу добавить это? Также кнопка является кнопкой изображения в самом виджете. – Si8

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