开发后,Android小部件未显示在列表中。

24

我正在使用小部件升级我的应用程序。这不是我做的第一个小部件。我经常会遇到奇怪的问题,但最终小部件总是会出现在列表中。

目前为止,我已经完成了以下工作:

  • 创建widget_layout.xml文件
  • 创建widget_info.xml文件
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"  
    android:minWidth="110dp"
    android:minHeight="30dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/widget_layout"
    android:resizeMode="none">
</appwidget-provider>
  • 创建了WidgetProvider类
  • <application>部分的清单文件中添加了小部件(由于无法在此处粘贴清单片段,因此未显示,请在此处查看代码)

然而,在小部件列表中找不到小部件。我正在真实设备上调试应用程序。我使用库项目,但小部件文件都在我直接运行的项目中。这里可能出了什么问题?


如果它在Android 9中没有列出怎么办? - Ghasem
8个回答

29

我也遇到了类似的问题,这是我的解决方法。在下面的小部件中,直到添加了minResizeHeight,小部件才会显示在窗口小部件抽屉中。很奇怪,但可能是可调整大小的小部件所必需的。本来可以更友好一些。

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/pmt_schedule_scroll_widget"
android:minHeight="146dip"
android:minResizeHeight="73dp"
android:minWidth="146dip"
android:resizeMode="vertical"
android:updatePeriodMillis="0" />

3
我正在使用resizeMode="none",但仍建议添加minResizeHeight和minResizeWidth。 - Matt

24

此类问题可能有两种情况。以上均已回答,这是一份完整的答案,我曾经遇到过这两种情况并解决了它们。

情况1

如果应用在清单文件中指定了android:installLocation="preferExternal"参数,则应用将安装在外部存储器中,并且不会显示在小部件列表中。如果您让手机将所有应用程序安装在SD卡上,也会出现这种情况。

解决方案

前往“设置”->“应用”->“YourApp”,然后选择“移动到手机”。这将把应用程序移动到手机内存中,现在您可以在小部件列表中看到该小部件。

情况2

如果上述修复方法无法解决您的问题,则您可能拥有 Android 4.X.X 版本的设备。

然后,您需要在 widget_info.xml 文件中至少设置以下参数:

解决方案2

android:minHeight="XXXdp" android:minWidth="XXXdp"


3
此外,如果最小高度和/或最小宽度过大,则无法在小部件列表中显示。将其更改为较小的分辨率后,它将出现。 - iedoc

9

问题出在android:installLocation="preferExternal"

如果应用程序安装在SD卡上,它会对挂件列表造成一些问题。


这段简单的代码帮了我很多忙,节省了很多时间。谢谢。 - canova
事实上,小部件始终与 SD 安装不兼容。用户不会收到来自 Android 的任何警告,小部件只是不会出现在列表中。 - Jose_GD

8

我尝试了各种解决方案,但都没有成功...最终我解决了它。

在我的情况下,问题出在过度思考上:我认为在标签中需要定义提供程序的唯一名称(例如:“com.example.myprovider”),以及链接到xml资源。

错误的做法:

<meta-data
      android:name="com.example.myprovider"
      android:resource="@xml/widget_info" />

正确:

<meta-data
  android:name="android.appwidget.provider"
  android:resource="@xml/widget_info" />

我在android:resource中链接widget布局而不是widget信息,哈哈 - Avi

5

您需要在清单文件中注册一个广播接收器。例如:

<receiver
   android:icon="@drawable/icon"
   android:label="Example Widget"
   android:name="MyWidgetProvider" >
   <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> 

我从http://www.vogella.com/articles/AndroidWidgets/article.html借用了这段代码。

请参阅链接以获取完整的教程。


2

经过数小时的搜索和尝试未果后,我决定打开一个正常工作的小部件示例项目,并逐一比较每个项目,以查找问题所在。最终,我解决了问题,将以下行添加到我的 res/xml/widget_info.xml 文件中:

android:minHeight="XXXdp"
android:minResizeHeight="XXXdp"
android:minResizeWidth="XXXdp"
android:minWidth="XXXdp"

其中XXX是某个值。


这也是我的罪魁祸首。 - Andrew Steinmetz

2
在我的情况下,问题在接收器内的intent-filter中。
错误示例:
<intent-filter>
    <action android:name="APPWIDGET_UPDATE" />
</intent-filter>

正确的做法:

<intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

1
在我的情况下,是minWidth太大了,只需使用更小的dp即可,同样适用于minHeight和height!

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