У меня есть виджет Android, который извлекает данные с сервера каждые 10 минут и отображает их на экране.
Я хотел бы добавить кнопку "Обновить" на этот виджет.
Когда пользователь нажимает на эту кнопку, я хочу запустить метод, который извлекает информацию с сервера.
Добавление обработчика событий к кнопке в приложении очень просто, однако я не могу найти пример для виджета.
Я хотел бы получить помощь в добавлении функции к щелчку кнопки в виджетах.
Событие нажатия кнопки для виджета Android
Ответ 1
Я узнал, как это сделать.
Добавьте действие в файл AndroidManifest.xml
в тег > <receiver><intent-filter>
:
<action android:name="MY_PACKAGE_NAME.WIDGET_BUTTON" />
В провайдере добавьте константу, которая соответствует имени действия:
public static String WIDGET_BUTTON = "MY_PACKAGE_NAME.WIDGET_BUTTON";
В методе onUpdate()
добавьте ожидающее намерение, которое соответствует действию:
Intent intent = new Intent(WIDGET_BUTTON);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.MY_BUTTON_ID, pendingIntent );
Наконец, в методе onRecieve() проверьте имя действия:
if (WIDGET_BUTTON.equals(intent.getAction())) {
//your code here
}
Ответ 2
Вот еще один пример, который должен помочь:
package com.automatic.widget;
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.widget.RemoteViews;
public class Widget extends AppWidgetProvider {
private static final String SYNC_CLICKED = "automaticWidgetSyncButtonClick";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
RemoteViews remoteViews;
ComponentName watchWidget;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
watchWidget = new ComponentName(context, Widget.class);
remoteViews.setOnClickPendingIntent(R.id.sync_button, getPendingSelfIntent(context, SYNC_CLICKED));
appWidgetManager.updateAppWidget(watchWidget, remoteViews);
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
if (SYNC_CLICKED.equals(intent.getAction())) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews;
ComponentName watchWidget;
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
watchWidget = new ComponentName(context, Widget.class);
remoteViews.setTextViewText(R.id.sync_button, "TESTING");
appWidgetManager.updateAppWidget(watchWidget, remoteViews);
}
}
protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
}
Ответ 3
protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
views.setOnClickPendingIntent(R.id.Timm, getPendingSelfIntent(context,
"ham"));
Также предпочитает URL:
Как правильно обрабатывать события click на виджете
Если вы решили это по-другому, предоставьте это как ответ
Ответ 4
Вот еще один ответ со следующими преимуществами:
- Он обрабатывает все экземпляры App Widget (у пользователя может быть несколько экземпляров вашего виджета в различных конфигурациях/размерах на вашем экране). Кодирование для всех экземпляров - это то, что предписывает официальная документация. См. Руководство > Виджеты приложений > Использование класса AppWidgetProvider, прокрутите вниз до примера кода для "ExampleAppWidgetProvider".
- Код рабочей лошади в
onReceive
фактически вызываетonUpdate
(поэтому вы уменьшаете дублирование кода). - Код в
onUpdate(Context context)
обобщен, поэтому его можно отбросить в любой подкласс AppWidgetProvider.
Код:
public class MyWidget extends AppWidgetProvider {
private static final String ACTION_UPDATE_CLICK =
"com.example.myapp.action.UPDATE_CLICK";
private static int mCount = 0;
private static String getMessage() {
return String.valueOf(mCount++);
}
private PendingIntent getPendingSelfIntent(Context context, String action) {
// An explicit intent directed at the current class (the "self").
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
String message = getMessage();
// Loop for every App Widget instance that belongs to this provider.
// Noting, that is, a user might have multiple instances of the same
// widget on
// their home screen.
for (int appWidgetID : appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.my_widget);
remoteViews.setTextViewText(R.id.textView_output, message);
remoteViews.setOnClickPendingIntent(R.id.button_update,
getPendingSelfIntent(context,
ACTION_UPDATE_CLICK)
);
appWidgetManager.updateAppWidget(appWidgetID, remoteViews);
}
}
/**
* A general technique for calling the onUpdate method,
* requiring only the context parameter.
*
* @author John Bentley, based on Android-er code.
* @see <a href="#" onclick="location.href='http://android-er.blogspot.com
* .au/2010/10/update-widget-in-onreceive-method.html'; return false;">
* Android-er > 2010-10-19 > Update Widget in onReceive() method</a>
*/
private void onUpdate(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance
(context);
// Uses getClass().getName() rather than MyWidget.class.getName() for
// portability into any App Widget Provider Class
ComponentName thisAppWidgetComponentName =
new ComponentName(context.getPackageName(),getClass().getName()
);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(
thisAppWidgetComponentName);
onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (ACTION_UPDATE_CLICK.equals(intent.getAction())) {
onUpdate(context);
}
}
}
Виджет выглядит следующим образом
Это основано на работе getPendingSelfIntent
@Kels, @SharonHaimPour и @Erti-ChrisEelmaa.
Он также основывается на Android-er > 2010-10-19 > Обновить виджет в методе onReceive() (не я), где он продемонстрировал, как вызвать onUpdate из onReceive, на основе экземпляра приложения Widget. Я делаю этот код общим и завершаю его в callOnUpdate
.