【问题标题】:Android 4.0: widgets not appearing?Android 4.0:小部件没有出现?
【发布时间】:2012-01-09 20:44:14
【问题描述】:

我有一个针对 Android 2.1 创建的小部件,它很好并且在市场上销售。

我有一个用户抱怨他买了它,但它从未出现在他的 Android 4.0 设备上。

我加载了 4.0 模拟器,从 Eclipse 运行它,它报告安装成功,实际上我可以在“Widget Preview”应用程序中看到它,我可以在那里运行它,看起来不错,但它没有'没有出现在“小部件”下的任何地方——我实际上找不到它来将它拖到主屏幕上!我认为这与用户看到的内容相同。

知道这里发生了什么吗? 为什么在 2.1 中可以正常安装,但在 4.0 中没有出现在列表中,即使安装成功?

这是我的 layout\widget.xml 文件,如果有帮助的话:

<RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView android:layout_width="wrap_content" android:id="@+id/blankspot" android:layout_height="5dp" android:gravity="center" android:shadowDy="1" android:shadowDx="1" android:layout_centerHorizontal="true"></TextView> 
    <ImageButton android:layout_below="@+id/blankspot" android:layout_width="60dp" android:layout_height="60dp" android:id="@+id/widgetIconButton" android:layout_centerHorizontal="true" android:scaleType="centerCrop" android:src="@drawable/volumeprofilesplus" android:background="@null"></ImageButton>
    <ImageView android:layout_width="60dp" android:layout_height="20dp" android:id="@+id/override" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:scaleType="fitXY" android:background="@null" android:src="@drawable/overredcaps" android:visibility="invisible"></ImageView>
    <ImageButton android:layout_below="@+id/widgetIconButton" android:layout_width="70dp" android:layout_height="30dp" android:id="@+id/widgetSettingsButton" android:layout_centerHorizontal="true" android:scaleType="fitXY" android:src="@drawable/settings" android:background="@null"></ImageButton>
</RelativeLayout>

还有 xml\widget_provider.xml:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="72dip"
    android:minHeight="72dip"
    android:updatePeriodMillis="0"
    android:initialLayout="@layout/main" >    
</appwidget-provider>

【问题讨论】:

  • 请发布您的 {widget}.xml
  • 清单或提供者 xml?让我弄清楚如何正确粘贴代码...
  • layouts\widget.xml - 这是一个“错字”还是您的提供者 xml 真的在布局文件夹中?应该在res/xml/widget.xml
  • 是的,糟糕,粘贴了错误的东西。修好了。我也可以发布清单,但它相当冗长。我在我的 Thunderbolt (2.3.4) 上运行良好,它显示在下载列表中并且实际上正在运行,但我看不出有办法将它带到桌面上。我在 4.0 模拟器上滚动了所有小部件列表,但它没有显示出来。
  • 呃。嗯。所以它只是在我重新启动设备后出现。所以我想答案是“有时你必须重启你的设备”?我暂时把这个问题留作一个问题,以防我的 XML 中真的有我应该有的东西。

标签: android widget android-4.0-ice-cream-sandwich


【解决方案1】:

所以这是我想出的解决方案:

您需要一个将显示在启动器上的活动。所以首先我们有 ye olde 小部件接收器,如下所示:

<receiver android:name=".VolumeProfilesWidget" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />                
        <!-- Broadcast Receiver that will also process our self created action -->
        <action android:name="net.thepurge.volumeprofiles.plus.VolumeProfilesWidget.ACTION_WIDGET_RECEIVER"/>               
    </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/volumeprofiles_widget_provider" />
</receiver>

然后我们需要一些活动,设置 MAIN 和 LAUNCHER:

<activity android:name=".MainActivity"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />                
        <action android:name="net.thepurge.volumeprofiles.plus.VolumeProfilesWidget.ACTION_WIDGET_CONFIGURE"/>
    </intent-filter>
</activity>

据我所知,即使您的小部件应该是没有关联活动的纯小部件,也必须这样做。至少,创建一个虚拟活动来启动一个屏幕,显示“您的小部件现在可以使用了!在小部件下查找它并将其拖到您的主屏幕!”

在我的例子中,当你推送它时,我的小部件启动了一个活动,所以我将该活动放入 LAUNCHER/MAIN 并添加了一个一次性弹出对话框,基本上说“你可以将它作为应用程序运行,但你可能想要改为使用小部件”。

请注意,在 4.0 模拟器上,在此更改之前,我从未让我的小部件出现在第一次安装时。只需将活动设置为 MAIN 和 LAUNCHER 似乎就足以使小部件显示出来。

【讨论】:

  • 这只是模拟器的问题还是会影响 Android 4.0 设备?
  • 显然是这样。见Issue 24208
  • 是的,它也在设备上。我最初是从一个客户那里听说的,他为 4.0 设备购买了我的应用程序但找不到它。他能够通过重新启动使其出现,但我不认为“关闭并重新启动”是一个非常好的长期解决方案。 (尽管它为微软工作了多年。)
  • 这太荒谬了,我们必须弄乱用户的应用程序启动器才能使其在某些版本的 Android 上运行,但您的解决方案似乎是解决办法。
【解决方案2】:

几天后我想出了解决方案

因此,让我们转到您打开应用程序和主活动时将启动的任何活动 只添加这一行

sendBroadcast(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));

举例

public class Default class extends Activity  {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
       sendBroadcast(new Intent(Intent.ACTION_MAIN)
       .addCategory(Intent.CATEGORY_HOME));
    setContentView(R.layout.main);



}

就是这样,这将为系统提供主应用程序现在正在运行的系统,并将小部件发送到启动器:) 简单的行就是它不修改清单中的任何内容 只需保持您开发应用程序的方式即可在以前的版本中正常显示小部件

【讨论】:

    【解决方案3】:

    遇到同样的问题。我通过删除appwidgetprovider.xml(located in res/xml) 中的&lt;PreferenceScreen&gt; 标签来修复它。

    【讨论】:

    • 我在任何地方都没有 PreferenceScreen 标签。
    【解决方案4】:

    您需要至少手动启动一次关联的应用程序才能显示小部件。在此之前它处于不可运行状态,不会接收广播等。

    【讨论】:

    • 啊,所以我在重新启动时看到它可能是一个巧合,而真正让它出现在那里的是在小部件预览中打开它?除了小部件预览,我们还能如何告诉人们“手动启动关联的应用程序”?从技术上讲,它只是一个小部件——“应用程序”下没有任何内容可显示。
    • 可能是,我实际上并没有详细研究过这个。添加一个简单的测试活动并尝试一下。如果事实证明这是必需的,您可以使用它来更改设置、提供说明等。不理想,我同意。
    • 我投了反对票,因为我不认为这是尝试。我有一个纯小部件,我在 2.3 和 4.1 上使用过而没有运行相关应用程序。我必须承认我在这里是因为那个小部件后来变得不稳定,但有一段时间它作为一个“纯小部件”工作得很好。
    • @NikolayElenkov - 嗨,我似乎没有在 android 4.4 的小部件列表中看到我的小部件,它适用于其他版本的 android,我也有启动器活动。可能是什么问题?我也尝试重新启动我的设备。请帮忙。
    【解决方案5】:

    我的解决方案(4.1.2 上的小部件)确保小部件已安装在内部设备存储上。

    根据:Android Documentation: install-location,您不应该在外部存储上安装小部件。

    我不得不卸载我的小部件,重新安装它,然后我看到了变化!

    有用的链接:

    http://www.technipages.com/fix-android-app-widgets-not-appearing-on-widget-list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多