私は、AppWidgetProviderクラスのonUpdate()セクションから開始されたサービスによって更新されているApp Widgetに取り組んでいます。問題は、ウィジェットサービス内でカーソルを使用するたびにビューがウィジェットに追加されないことです。 SQLクエリ/結果を文字列に置き換えるだけで動作します。SQliteクエリを使用したAndroid Appウィジェット
(の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;
}
}
この例では、SQL戻り結果ビューが追加されていても、追加のビューなしのみレイアウト「test_widget」を示しています。
の作業例(文字列のみ):
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;
}
}
この実施例では、私がしようと先週過ごしてきた
のLinearLayout IDが「test_widget_items」内に挿入されたビューのレイアウト「test_widget」を示していこのウィジェットにSQL結果を使用させると、だれかが間違っているかもしれないというわずかなアイデアはありますか?
私はだけではなく、完全なDBをインスタンス化の)TestWidgetService.this.openOrCreateDatabaseを(試してみましたヘルパークラスが、私は同じ問題を抱えているが、結果が正しく読み込まれている(そしてLogCatに表示されていても)追加されたビューはウィジェットに表示されません。 – Andre