Источник обновлений ImageButton в AppWidget - PullRequest
2 голосов
/ 29 сентября 2011

Я пытаюсь повторить функциональность ToggleButton с точки зрения RemoteViews, чтобы я мог включить ее в своем виджете приложения.У меня есть ImageButton, и он у меня обнаруживает щелчки, но у меня возникают проблемы при изменении изображения, которое отображается при нажатии.У меня сложилось впечатление, что мне нужно принудительно обновить виджет после того, как он был нажат, чтобы отобразить изменения.Любая идея, как лучше это сделать?

public class WifiWidget extends AppWidgetProvider {

boolean toggleState = false;
public static String ACTION_WIDGET_RECEIVER = "com.nickavv.cleanwidgets.WIFICLICK";
Context myContext;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) {
    final int N = appWidgetIds.length;
    myContext = context;
    for (int i = 0; i < N; i++) {
        int appWidgetId = appWidgetIds[i];
        RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.wifi_toggle_layout);
        Intent intent = new Intent(ACTION_WIDGET_RECEIVER);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        views.setOnClickPendingIntent(R.id.wifiToggleButton, pendingIntent);
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

@Override  
public void onReceive(Context context, Intent intent) {  
    super.onReceive(context, intent);
    if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) { 
        switchToggle();
    }    
}

void switchToggle() {
    RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.wifi_toggle_layout);
    Log.d("toggleState",""+toggleState);
    if(toggleState == false) {
        views.setImageViewResource(R.id.wifiToggleButton, R.drawable.wifi_toggle_on);
    } else {
        views.setImageViewResource(R.id.wifiToggleButton, R.drawable.wifi_toggle_off);          
    }
    toggleState = !toggleState;
    Log.d("toggleState",""+toggleState);
}

РЕДАКТИРОВАТЬ: добавил это в нижней части switchToggle:

AppWidgetManager myAWM = AppWidgetManager.getInstance(myContext);
ComponentName cn = new ComponentName(myContext, WifiWidget.class);
onUpdate(myContext, myAWM, myAWM.getAppWidgetIds(cn));

1 Ответ

1 голос
/ 29 сентября 2011

Да, вы должны обновить виджет. Судя по всему, вы можете просто позвонить onUpdate() напрямую и прочитать состояние кнопки там, чтобы обновить RemoteViews соответственно. Просто используйте RemoteViews.setImageViewResource(), чтобы установить изображение, соответствующее текущему состоянию кнопки.

Все, что вам нужно для вызова onUpdate() - это аргументы, которые вы можете получить через Context:

  • Контекст: Вы можете передать это от получателя на switchToggle() и на onUpdate()
  • Экземпляр AppWidgetManager: получите это через AppWidgetManager.getInstance(context)
  • Массив идентификаторов виджетов приложения: используйте AppWidgetManager.getAppWidgetIds()

getAppWidgetIds() принимает ComponentName в качестве аргумента. Вы можете создать один, как показано ниже:

ComponentName cn = new ComponentName(context, WifiWidget.class);

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

...