带有 SQlite 查询的 Android 应用程序小部件
我正在开发一个由服务更新的应用程序小部件,该服务从 AppWidgetProvider 类的 onUpdate() 部分开始。问题是,每当我在小部件服务中使用游标时,视图都不会添加到小部件中。如果我只是将 sql 查询/结果替换为字符串,它就可以工作。
不起作用的示例(使用 ContentProvider/SQL):
public class TestWidgetService extends Service {
@Override
public void onStart(Intent intent, int startId) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget
);
// get items
Uri items = Uri.parse(TestWidgetContent.CONTENT_URI + "/news/1");
Cursor iCursor = getContentResolver().query(items, null, null, null, "ITM_TIMESTAMP DESC");
if (iCursor == null) {
continue;
}
else if (iCursor.moveToFirst()) {
while (iCursor.isAfterLast() == false) {
Log.w("got", iCursor.getString(iCursor.getColumnIndex("FED_TITLE")));
RemoteViews item = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget_item
);
item.setTextViewText(
R.id.test_widget_item_feed,
iCursor.getString(iCursor.getColumnIndex("FED_TITLE"))
);
item.setTextViewText(
R.id.test_widget_item_title,
iCursor.getString(iCursor.getColumnIndex("ITM_TITLE"))
);
remoteViews.addView(R.id.test_widget_items, item);
iCursor.moveToNext();
}
}
iCursor.close();
//
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
stopSelf();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
此示例仅显示布局“test_widget”,没有添加视图,即使 sql 返回结果并且添加了视图。
工作示例(仅字符串):
public class TestWidgetService extends Service {
@Override
public void onStart(Intent intent, int startId) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget
);
// get items
RemoteViews item = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget_item
);
item.setTextViewText(
R.id.test_widget_item_feed,
"feed"
);
item.setTextViewText(
R.id.test_widget_item_title,
"title"
);
remoteViews.addView(R.id.test_widget_items, item);
//
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
stopSelf();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
此工作示例显示了布局“test_widget”,其中插入了 LinearLayout id“test_widget_items”中的视图
我上周一直在尝试让此小部件使用 sql 结果,任何人都知道可能会发生什么有错吗?
I'm working on an App Widget which is being updated by a service, started from the onUpdate() section of the AppWidgetProvider class. The problem is that whenever I use Cursors inside the widget service, the views are not being added to the widget. If I simply replace the sql query/result for a string, it works.
Not working example (using ContentProvider/SQL):
public class TestWidgetService extends Service {
@Override
public void onStart(Intent intent, int startId) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget
);
// get items
Uri items = Uri.parse(TestWidgetContent.CONTENT_URI + "/news/1");
Cursor iCursor = getContentResolver().query(items, null, null, null, "ITM_TIMESTAMP DESC");
if (iCursor == null) {
continue;
}
else if (iCursor.moveToFirst()) {
while (iCursor.isAfterLast() == false) {
Log.w("got", iCursor.getString(iCursor.getColumnIndex("FED_TITLE")));
RemoteViews item = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget_item
);
item.setTextViewText(
R.id.test_widget_item_feed,
iCursor.getString(iCursor.getColumnIndex("FED_TITLE"))
);
item.setTextViewText(
R.id.test_widget_item_title,
iCursor.getString(iCursor.getColumnIndex("ITM_TITLE"))
);
remoteViews.addView(R.id.test_widget_items, item);
iCursor.moveToNext();
}
}
iCursor.close();
//
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
stopSelf();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
This example shows only the layout "test_widget" without the added views, even though the sql returns results and the views are added.
Working example (String only):
public class TestWidgetService extends Service {
@Override
public void onStart(Intent intent, int startId) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
ComponentName thisWidget = new ComponentName(getApplicationContext(), TestWidget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget
);
// get items
RemoteViews item = new RemoteViews(
getApplicationContext().getPackageName(),
R.layout.test_widget_item
);
item.setTextViewText(
R.id.test_widget_item_feed,
"feed"
);
item.setTextViewText(
R.id.test_widget_item_title,
"title"
);
remoteViews.addView(R.id.test_widget_items, item);
//
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
stopSelf();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
This working example shows the layout "test_widget" with the views inserted within the LinearLayout id "test_widget_items"
I have spent the last week trying to get this widget to use sql results, anyone has any slight idea what might be wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
原来是模拟器的问题,删除AVD快照并再次启动应用程序后,小部件就正常了
Turns out it was a problem with the emulator, after removing the AVD snapshot and starting the app again, the widget was fine