我有一个你按下的小部件然后它会更新小部件上的文本。我已经设置了一个on click监听器来启动另一个活动来执行文本更新,但由于某种原因它只能暂时工作,然后它会变得没有响应,并且在按下时不会执行任何操作。有谁知道它为什么这样做?我在下面发布了我的小部件代码以防它有用。
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
thisWidget = new ComponentName(context, MemWidget.class);
Intent intent = new Intent(context, updatewidget.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
views.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current App Widget
appWidgetManager.updateAppWidget(thisWidget, views);
}
@Override
public void onReceive(Context context, Intent intent)
{
appWidgetManager = AppWidgetManager.getInstance(context);
remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
thisWidget = new ComponentName(context, MemWidget.class);
// v1.5 fix that doesn't call onDelete Action
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
{
super.onReceive(context, intent);
}
}
以下是从我的活动中调用的代码
thisWidget = new ComponentName(this, MemWidget.class);
appWidgetManager = AppWidgetManager.getInstance(this);
remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget);
//do work
remoteViews.setTextViewText(R.id.ImageButton01,"setting text here");
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
答案 0 :(得分:1)
onUpdate方法不会更新除PendingIntent之外的RemoteViews中的任何数据,因此如果调用了该数据,则窗口小部件将恢复为R.layout.widget中定义的状态。
您是否拥有在用户交互后调用updateAppWidget的代码?这也许有帮助。
此外,如果更新是内联的并且不需要任何UI,则无需启动活动即可执行该更新。如果您的PendingIntent用于广播接收器,使用PendingIntent.getBroadcast,它会更高效并且不会破坏后台堆栈。您可以使用与您的应用小部件提供商相同的BroadcastReceiver。你不需要另一个。
更新:(由于文字太长,我无法在下面回复)
我会创建一个这样的函数,并从onUpdate()的活动中调用它。您需要在某处保存 text ,这样您也可以从onUpdate()传入它。否则,它会将文本恢复为R.layout.widget中的默认值。
void updateWidget(Context context, CharSequence text) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent);
remoteViews.setTextViewText(R.id.ImageButton01, text);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, MemWidget.class);
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}