Android 安卓4.0:小部件不出现?

Android 安卓4.0:小部件不出现?,android,widget,android-4.0-ice-cream-sandwich,Android,Widget,Android 4.0 Ice Cream Sandwich,我有一个针对Android 2.1创建的小部件,它很好,在市场上很畅销 我有一个用户抱怨说他买了它,但它从来没有出现在他的安卓4.0设备上 我加载了4.0 emulator,从Eclipse运行,它报告了一个成功的安装,事实上我可以在“Widget Preview”应用程序中看到它,我可以在那里运行它,它看起来很好,但它不会显示在“Widgets”下的任何地方——我实际上找不到它来将它拖到主屏幕!我假设这和用户看到的是同一件事 知道这是怎么回事吗? 为什么它在2.1中很好,但在4.0中却没有出现

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

我有一个用户抱怨说他买了它,但它从来没有出现在他的安卓4.0设备上

我加载了4.0 emulator,从Eclipse运行,它报告了一个成功的安装,事实上我可以在“Widget Preview”应用程序中看到它,我可以在那里运行它,它看起来很好,但它不会显示在“Widgets”下的任何地方——我实际上找不到它来将它拖到主屏幕!我假设这和用户看到的是同一件事

知道这是怎么回事吗? 为什么它在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\u 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>


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

因此,我提出了一个解决方案:

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

<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>

然后我们需要一些活动,主要和启动器设置:

<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 emulator上,在进行此更改之前,我从未在第一次安装时显示我的小部件。简单地将活动设置为MAIN和LAUNCHER似乎就足以让小部件显示。

也遇到了同样的问题。在我想出解决方案的几天后,我通过删除我的
appwidgetprovider.xml(位于res/xml中)中的
标记来修复它

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

sendBroadcast(新意图(意图.动作.主项).添加类别(意图.类别.主项))

举例来说

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);



}
就是这样,这将给主应用程序正在运行的系统提供一个小部件,它将把小部件发送给启动器:)简单的一行,就是它不修改清单中的任何内容 只需保持您开发的ur应用程序在早期版本中正常显示小部件的方式<4.x

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

根据:,您不应该在外部存储上安装小部件

我不得不卸载我的小部件,再次安装,然后我看到了变化

有用链接:


请发布您的{widget}.xmlmansifest或提供者xml?让我弄清楚如何正确粘贴代码…
layouts\widget.xml
-这是一个“输入错误”还是您的提供者xml真的在layout文件夹中?应该在
res/xml/widget.xml
中。哎呀,贴错东西了。把它修好了。我也可以发布清单,但是太长了。我在我的Thunderbolt(2.3.4)上运行得很好,它显示在下载列表中,并且实际上正在运行,但我认为没有办法将它带到桌面。我在4.0模拟器上滚动了所有小部件列表,但它没有显示出来。呵呵。所以它是在我重新启动设备后出现的。所以我猜答案是“有时你必须重新启动你的设备”?我现在把这个问题留作一个问题,以防我的XML中真的有我应该有的东西。啊,所以我在重新启动时看到它可能是巧合,而真正让它出现的是在小部件预览中打开它?除了widget预览,我们还能告诉人们“手动启动相关应用程序”吗?从技术上讲,它只是一个小部件——在“应用程序”下没有显示任何内容。可能,我还没有详细研究过这个问题。添加一个简单的测试活动并进行尝试。如果结果证明这是必需的,你可以用它来改变设置,给出指示,等等。我同意,这并不理想。我投了反对票,因为我认为这不是尝试。我在2.3和4.1上使用了一个纯widget,但从未运行过相关应用程序。我必须承认,我在这里是因为这个小部件后来变得不稳定,但有一段时间它作为一个“纯小部件”工作得很好。@NikolayElenkov-嗨,我似乎没有在小部件列表中看到我的小部件,只有在安卓4.4中,它与安卓的其他版本配合得很好,我也有启动活动。可能是什么问题?我也尝试重新启动我的设备。请提供帮助。这只是模拟器的一个问题,还是会影响安卓4.0设备?显然会。看,是的,它也在设备上。我第一次从一位客户那里听说这件事,他为4.0设备购买了我的应用程序,但找不到。他能够通过重新启动使它看起来像,但我不认为“闭嘴并重新启动”是一个很好的解决方案,从长远来看。(虽然它已经为微软工作了多年。)这太荒谬了,我们不得不把用户的应用程序启动器弄得乱七八糟,才能让它在某些版本的Android上工作,但你的解决方案似乎就是解决方案。我从来没有在任何地方使用过PreferenceScreen标签。