我是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>
我做错了什么?
有没有更好的方法来达到我的目标?
非常感谢你。
答案 0 :(得分:1)
您在setUsage
中执行的操作不足以更新窗口小部件:您必须在更新updateAppWidget
实例后调用RemoteViews
。如果您调用Utils.Log("Widget updated with " + usage);
,则必须再次加载整个RemoteViews
实例,设置所有相应的属性(包括您实际想要更新的文本视图),然后调用updateAppWidget
。