安卓4.0:小部件无法显示?

27

我创建了一个面向Android 2.1的小部件,一直很好地在市场上销售。

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

我在Eclipse中加载了4.0仿真器,成功安装并且实际上我可以在“小部件预览”应用程序中看到它,并且我可以在那里运行它,看起来一切正常,但是它没有出现在“小部件”下的任何位置-我无法找到它将其拖到主屏幕上! 我认为这就是用户看到的情况。

这里有什么问题吗?为什么在2.1中没问题,在4.0上却无法在列表中显示,即使成功安装了也是如此?

如果可以的话,请看一下我的布局\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>

1
请发布您的{widget}.xml文件。 - Force
清单文件或提供程序XML?让我想一想如何正确粘贴代码... - JamieB
layouts\widget.xml - 这是一个“打字错误”还是你的提供者真的将xml文件放在了layout文件夹中?应该放在 res/xml/widget.xml 中。 - user658042
是的,抱歉,我粘贴了错误的内容。我已经修复了它。我也可以发布清单,但它相当冗长。我在我的Thunderbolt(2.3.4)上成功运行它,并且它出现在下载列表中并实际运行,但我看不到将其带到桌面的方法。我在4.0模拟器的小部件列表中滚动了所有内容,但它没有显示出来。 - JamieB
嗯,我重新启动设备后它就出现了。所以我猜答案是“有时候你只需要重新启动设备”?暂时我会把这个问题留着,以防我在XML中漏掉了什么。 - JamieB
5个回答

17

这是我想出的解决方案:

你需要一个将出现在启动器上的活动。所以我们首先需要像这样的小部件接收器:

<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 设备? - Alex Jasmin
1
显然是这样的。请参见问题24208 - Alex Jasmin
3
是的,它也适用于设备上。我最早是从一位客户那里听说的,他在4.0的设备上购买了我的应用程序,但找不到它。他通过重新启动设备使其显示出来,但我认为“闭嘴并重新启动”不是一个长期有效的解决方案。(尽管这个方法多年来一直适用于微软。) - JamieB
这真是荒谬,我们不得不在用户的应用启动器中添加混乱的内容,才能让它在某些版本的Android上正常工作,但你的解决方案似乎是正确的。 - Code Commander

9

经过几天的研究,我找到了解决方案。

现在我们来看看你打开应用程序时会启动的任何活动,在主活动中只需添加这一行:

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



}

就是这样,这将使系统知道主应用程序正在运行,并将小工具放到启动器中 :) 这是一条简单的指令,请不要修改清单文件中的任何内容,只需保持您开发应用程序的方式即可在早期版本(小于4.x)中正常显示小部件。


3
我遇到了同样的问题。我通过删除appwidgetprovider.xml(位于res/xml)中的<PreferenceScreen>标签来解决问题。

2
我从未在任何地方使用过PreferenceScreen标签。 - JamieB

1

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


啊,那我在重启时看到它可能只是巧合,真正让它出现在那里的是在小部件预览中打开它?除了小部件预览之外,我们还可以如何告诉人们“手动启动相关应用程序”?从技术上讲,它只是一个小部件 - 在“应用程序”下没有任何显示。 - JamieB
可能是的,我实际上还没有详细研究过这个。添加一个简单的测试活动并尝试一下。如果证明需要,您可以使用它来更改设置、给出指示等。虽然不理想,但我同意。 - Nikolay Elenkov
1
我投了反对票,因为我认为这不是正确的。我有一个纯小部件,我从未运行过相关应用程序,在2.3和4.1上使用过。我必须承认,我在这里是因为那个小部件后来变得有点奇怪,但有一段时间它作为“纯小部件”工作得很好。 - Tom
@NikolayElenkov - 你好,我似乎在Android 4.4中的小部件列表中看不到我的小部件,但在其他版本的Android中它运行良好,我也有启动器活动。可能是什么问题?我还尝试重新启动设备。请帮忙。 - Rat-a-tat-a-tat Ratatouille

0

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