setTextViewText无法更新小部件

9
下面是我简化后的类的版本。我在onReceive方法中遇到了麻烦,它没有更新小部件TextView。在setTextViewText之前输出的logcat显示了正确的信息。我不确定问题出在哪里,一直在担心(而且我已经开始秃头了)。
public class SnowWidget extends AppWidgetProvider {

public static List<Article> mymtns = new ArrayList<Article>();
public static RemoteViews remoteViews;
public static ComponentName thisWidget;

public static String amount = "";
public static String mtn_name = "";
public static String desc = "";
public static String condition = "";
public static String[] type;

public static int index = 0;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
  int[] appWidgetIds) 
{

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);

    thisWidget = new ComponentName(context, SnowWidget.class);

    // This one works fine
    remoteViews.setTextViewText(R.id.snowwidget,  mtn_name+ "\n"+ amount+"\"\n"+ condition);

    /* Make the buttons work */

Intent next = new Intent(context, SnowWidget.class);
next.setAction(ACTION_WIDGET_RECEIVER);

PendingIntent nextPendingIntent = PendingIntent.getBroadcast(context, 0, next, 0);
remoteViews.setOnClickPendingIntent(R.id.nextMtn, nextPendingIntent);

/* END - Make the buttons work */

    appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}

@Override
public void onReceive(Context context, Intent intent) {

    // check, if our Action was called
    if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) {
        if(mymtns.size() > 0)
        {

            // This show up correctly in logcat
            Log.d("onReceive", "New Info => "+ mtn_name+ "\n"+ amount+"\"\n"+ condition);
            // This never updates my widget
            remoteViews.setTextViewText(R.id.snowwidget,  mtn_name+ "\n"+ amount+"\"\n"+ condition);

        }
    }

    super.onReceive(context, intent);
}

}

1个回答

23

找到答案了。 在调用remoteViews.setTextViewText之后,您需要使用updateAppWidget调用来更新小部件。 我添加的代码如下所示。

AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(thisWidget, remoteViews);

非常感谢!很难形容这个问题给我带来了多大的头痛。 - Abhinav Manchanda
5
我有这段代码,以前可以用,但现在不能了。我不知道发生了什么事情。 - xdumaine
你在哪里添加这几行代码?我的小部件好像无法正常工作。 - Si8
我在configure activity中传递了错误的标志,导致widgetId没有更新: PendingIntent.getActivity(context, 0, intent, 0) 正确的应该是: PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) - Ivan Fork
谢谢Ivan,我在使用FLAG_ONE_SHOT时遇到了一些奇怪的行为,当我将标志设置为0时,它就不再刷新了。 - vdechef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接