android小部件无响应
我有一个小部件,你按下它,然后它会更新小部件上的文本。我已经设置了一个点击监听器来启动另一个活动来执行文本更新,但由于某些原因,它只会暂时工作,然后它会变得无响应,按下时不会执行任何操作。有人知道为什么会这样吗?我已经在下面发布了我的小部件代码,以防有用android小部件无响应,android,widget,Android,Widget,我有一个小部件,你按下它,然后它会更新小部件上的文本。我已经设置了一个点击监听器来启动另一个活动来执行文本更新,但由于某些原因,它只会暂时工作,然后它会变得无响应,按下时不会执行任何操作。有人知道为什么会这样吗?我已经在下面发布了我的小部件代码,以防有用 @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { thisWidget = n
@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);
那里的onUpdate方法不会更新RemoteView中除PendingEvent之外的任何数据,因此如果调用了该方法,小部件将恢复到R.layout.widget中定义的状态 您有在用户交互后调用updateAppWidget的代码吗?这可能也有帮助 此外,如果更新是内联的并且不需要任何UI,则不需要启动活动来进行更新。如果您的PendingEvent用于广播接收器,则使用PendingEvent.getBroadcast会更高效,并且不会中断后堆栈。您可以使用与应用程序小部件提供商相同的BroadcastReceiver。你不需要另一个
更新:(我无法回复以下内容,因为文本太长) 我将创建一个这样的函数,并从onUpdate()的活动中调用它。您需要将文本保存在某个位置,以便也可以从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);
}
谢谢你的回复。我添加了在启动活动的用户交互之后调用updateappwidget的代码。我会将小部件更改为使用broadcastreceiver,而不是启动活动,这是不必要的。在寻找解决方案时,我发现了这样一个答案:“确保我在每次RemoteView更新时发送所有PendingEvents,即使它们已经设置好。当方向改变时,布局会膨胀,并且只有最近缓存的RemoteView才会应用到它上面。”但我该怎么做呢?