小工具从后台接收器更新

时间:2011-08-28 15:36:48

标签: android android-widget

我是Android的新手,所以每件简单的东西都是山 我正在实现一个应用程序(带有后台接收器)收听电话并做一些事情:这很有效 我试图添加一个小部件(从接收器更新)显示一些状态,但这不起作用,小部件不会更新。

这是我的小部件的一部分:当它启动时,它显示正确的状态。

public class BlacklistWidget extends AppWidgetProvider {

    RemoteViews remote;
    ComponentName provider;
    Context context;

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

        // create the remote view
        remote = new RemoteViews(context.getPackageName(), R.layout.widget);
        provider = new ComponentName(context, BlacklistWidget.class);

        this.context = context;

        Resources r = context.getResources();
        String[] usage_arr = r.getStringArray(R.array.pref_usage_array);
        int usage = Prefs.getUsage();
        Utils.Log("Widget onUpdate: " + usage);
        // remote.setImageViewResource(R.id.icon_usage,
        remote.setTextViewText(R.id.usage, usage_arr[usage]);

        appWidgetManager.updateAppWidget(provider, remote);
    }
}

当接收者更改静态类的状态时,将调用此方法:

public static void setUsage(int usage) {
    Usage = USAGE.values()[usage];

    try {
        Resources r = pcontext.getResources();
        String[] usage_arr = r.getStringArray(R.array.pref_usage_array);
        remoteViews.setTextViewText(R.id.usage, usage_arr[usage]);
        Utils.Log("Widget updated with " + usage);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

如您所见,用于更新小部件的代码与小部件Update()中包含的代码相同 抛出没有异常并且发送更新的文本是正确的..但是小部件TextView保持不变。

在manifest小部件中定义为foolows:

<receiver android:name=".BlacklistWidget" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/widget_info" />
</receiver>

我做错了什么? 有没有更好的方法来达到我的目标?
非常感谢你。

1 个答案:

答案 0 :(得分:1)

您在setUsage中执行的操作不足以更新窗口小部件:您必须在更新updateAppWidget实例后调用RemoteViews。如果您调用Utils.Log("Widget updated with " + usage);,则必须再次加载整个RemoteViews实例,设置所有相应的属性(包括您实际想要更新的文本视图),然后调用updateAppWidget