Android 4.0:小部件没有出现?

时间:2012-01-09 20:44:14

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

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

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

我加载了4.0模拟器,从Eclipse运行它,它报告了一个成功的安装,事实上我可以看到它列在“Widget预览”应用程序中,我可以在那里运行它看起来很好,但它没有不会出现在“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_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>

4 个答案:

答案 0 :(得分: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似乎足以让小部件显示出来。

答案 1 :(得分: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);



}

就是这样,这将给系统主应用程序现在正在运行,它将把小部件输出到启动器:)简单的行,它不会修改清单中的任何内容 只是保持你开发你的应用程序的方式,在以前的版本中显示小部件正常&lt; 4.x的

答案 2 :(得分:3)

遇到同样的问题。我通过删除<PreferenceScreen>中的appwidgetprovider.xml(located in res/xml)标记来修复它。

答案 3 :(得分:1)

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