我有一个针对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>
答案 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)
您需要至少手动启动关联的应用一次才能显示小部件。在此之前,它处于非可运行状态,并且不会接收广播等。