2010-06-14 111 views
2

我有一个你按下的小部件,然后它会更新小部件上的文本。我已经设置了一个点击监听器来启动另一个活动来执行文本更新,但由于某种原因它只能暂时工作,然后它将变得没有响应,并且在按下时不做任何事情。有谁知道它为什么会这样做?我发布了我的小部件代码以防万一它有帮助。android widget无响应

@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); 

回答

1

的的onUpdate方法有没有更新任何比的PendingIntent其他RemoteViews的数据,因此,如果这是有史以来调用,小部件将恢复到R.layout.widget中定义的状态。

您是否有在用户交互后调用updateAppWidget的代码?这可能也有帮助。

另外,如果更新是内联的并且不需要任何UI,则不需要启动一个活动来执行更新。如果您的PendingIntent是用于广播接收器,而不是使用PendingIntent.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); 
} 
+0

感谢您的回复。我在已启动活动的用户交互后添加了调用updateappwidget的代码。我将更改小部件以使用广播接收器,而不是启动不必要的活动。 在寻找解决方案时,我发现了这个答案“确保我将所有PendingIntents与每个RemoteViews更新一起发送,即使它们已经被设置。当方向更改时,布局充气且只有最近缓存RemoteViews应用于它。“ 但我该怎么做? – John 2010-06-15 15:06:33

+0

谢谢,它工作! – John 2010-06-16 02:24:39