带有 SQlite 查询的 Android 应用程序小部件

发布于 2024-12-28 16:07:22 字数 4075 浏览 3 评论 0原文

我正在开发一个由服务更新的应用程序小部件,该服务从 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

留蓝 2025-01-04 16:07:22

原来是模拟器的问题,删除AVD快照并再次启动应用程序后,小部件就正常了

Turns out it was a problem with the emulator, after removing the AVD snapshot and starting the app again, the widget was fine

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文