如何从我的应用程序将小部件添加到Android主屏幕?

21

我正在编写一个应用程序,当用户指示我的应用程序这样做时,应该能够将小部件(仅文本框)添加到用户手机的主屏幕上。 我该如何做到这一点?

我知道我可以添加应用程序小部件,但是如何添加更多小部件呢?


可能是绑定AppWidgets到AppWidgetHost - Android的重复问题。 - rds
@rds 看起来这个实际上应该成为另一个问题的重复目标。这个问题有更多有用的答案,并且被查看的次数是另一个问题的两倍左右。请参见此处:http://meta.stackoverflow.com/questions/252929/which-question-is-the-better-reference-for-a-duplicate - Daniel Nugent
如何添加一个应用程序小部件?我需要它,但不知道怎么做。 - Mir-Ismaili
我想把用户带到选择小部件屏幕,这是通过长按启动器屏幕并选择小部件获得的,如果appWidgetManager.isRequestPinAppWidgetSupported()返回false。我已经使用了Intent(AppWidgetManager.ACTION_APPWIDGET_PICK),但它会打开一个带有标题“选择小部件”的对话框,但在单击小部件项后什么也不发生。 - Vikas Pandey
4个回答

31

应用程序无法将小部件放置在主屏幕上。只有主屏幕可以向主屏幕添加应用程序小部件。

类似的链接:链接1链接2链接3

但是您可以向用户提供从Widget选择器中选择小部件的选项。

    Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
    pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetID);
    startActivityForResult(pickIntent, KEY_CODE);

1
@AdamArold 如果你想让用户决定是否添加小部件,我认为StineSpike的答案是正确的。也许你应该接受他的答案? - Jose_GD
2
好的。我完全忘记了这个问题。 - Adam Arold
4
你如何获取AppWidgetID和KEY_CODE? - StackOverflowed
3
你能否通过包中的附加内容或类似物将“picker”指向你的小部件? - Andrew Mackenzie
5
选取器对我来说无法运行。它出现了,但在选择时却没有反应。我尝试了一些方法来处理EXTRA_APPWIDGET_ID,但没有成功。我猜我的问题是,我的应用程序不是一个启动器,而是一个带有小部件的常规应用程序。 - madlymad
显示剩余8条评论

16

这个问题很久以前就有答案了,但是如果有人偶然发现了这个问题,我想提供一个最新的答案。

从Android O(API 26)开始,您现在可以将小部件固定到用户的启动器中!

只需在应用程序的AndroidManifest文件中创建小部件,并使用AppWidgetManager来请求将小部件固定到启动器。请注意,这取决于启动器是否支持此功能,因此在请求固定它之前,必须调用AppWidgetManager的isRequestPinAppWidgetSupported()方法。

这里是谷歌提供的更详细的文档:https://developer.android.com/preview/features/pinning-shortcuts-widgets.html#widgets

希望这能帮到你!

编辑:看起来自我回答后文档页面已更改。以下链接更有帮助,其中提供了如何将小部件固定到启动器的代码示例:https://developer.android.com/guide/topics/appwidgets/#Pinning


我已经阅读了它,但我不认为这就是 OP 所要求的。他想要在主屏幕上编程添加小部件。你提供的链接只描述了添加快捷方式 - 这基本上是在主屏幕上执行特定操作的图标(也可以从应用程序内完成)。但我找不到任何关于实际在主屏幕上添加小部件的提及。 - qkx
@qkx - 看起来自从我发布这个答案以来,文档页面已经发生了变化。我已经编辑了答案,包括一个更有帮助的链接。 - DalvikDroid

8

看起来Dalvik Droid的链接又更新了,最新的链接在requestPinAppWidget

例如: 在MainActivity.java中:

private void requestToPinWidget(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            AppWidgetManager appWidgetManager =
                    getSystemService(AppWidgetManager.class);
            ComponentName myProvider =
                    new ComponentName(this, AppWidget.class);
            assert appWidgetManager != null;
            if (appWidgetManager.isRequestPinAppWidgetSupported()) {
                Intent pinnedWidgetCallbackIntent = new Intent(this, MainActivity.class);
                PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
                        pinnedWidgetCallbackIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                appWidgetManager.requestPinAppWidget(myProvider, null, successCallback);
            }
        }
    }

在你的代码中无论何时调用requestToPinWidget()函数,都将弹出提示询问用户是否添加小部件到桌面。

需要注意的是,这并不会添加到用户的主屏幕,而是会追加到显示所有应用程序的页面:

Android小部件提示演示


我想要将用户带到选择小部件屏幕,就像我们通过长按启动器屏幕并选择小部件获得的那样,如果appWidgetManager.isRequestPinAppWidgetSupported()返回false。我已经使用了Intent(AppWidgetManager.ACTION_APPWIDGET_PICK),但它会打开一个带有标题“选择小部件”的对话框,但在单击小部件项目后什么也不会发生。 - Vikas Pandey

2
据我所知,默认启动器应用程序不支持此功能。原因是用户应该自己将所有内容放在主屏幕上。允许从应用程序中放置小部件将为应用程序打开“垃圾邮件”用户主屏幕的大门,这些小部件可能并不实用。

1
我正在尝试以一种需要用户交互才能放置小部件的方式编写它。 - Adam Arold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接