Android 4.0: виджеты не появляются?
У меня есть виджет, который я создал против Android 2.1, который был прекрасен и продавался на рынке.
У меня был пользователь, жалующийся, что он купил его, и он никогда не появлялся на его устройстве Android 4.0.
Я загрузил эмулятор 4.0, запустил его из Eclipse, он сообщил об успешной установке, и на самом деле я вижу его в списке "Приложение для просмотра Widget", и я могу запустить его там, и это кажется прекрасным, но это не так. "Не показывайте нигде под" Виджеты "- я не могу найти его, чтобы перетащить его на главный экран! Я предполагаю, что это то же самое, что видит пользователь.
Любая идея, что здесь происходит?
Почему это нормально в 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>
Ответы
Ответ 1
Итак, вот решение, с которым я столкнулся:
Вам нужна активность, которая появится на панели запуска. Итак, сначала у нас есть старый приемник виджетов, например:
<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, казалось, было достаточно, чтобы показать виджет.
Ответ 2
После нескольких дней я выяснил решение
поэтому давайте перейдем к любой вашей деятельности, которая будет запущена при открытии приложения и в основном действии
добавьте только эту строку
sendBroadcast (новый 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);
}
что это, это даст системе, что основное приложение теперь запущено, и оно выведет виджет на панель запуска:) простая строка, которая не изменяет ничего в манифесте
просто сохраните способ, которым вы разработали приложение ur, которое показывает нормальный виджетов в предыдущих версиях < 4.х
Ответ 3
Получена та же проблема. Я исправил его, удалив теги <PreferenceScreen>
в моем appwidgetprovider.xml(located in res/xml)
.
Ответ 4
Вам нужно вручную запустить связанное приложение хотя бы один раз, чтобы отобразить виджет. До этого он находится в состоянии, не подлежащем запуску, и он не будет получать широковещания и т.д.
Ответ 5
Мое решение (Виджет 4.1.2) было уверенным, что виджет установлен на внутреннем устройстве.
В соответствии с: Android Documentation: install-location, вы не должны устанавливать виджеты в External Storage.
Мне пришлось удалить мой виджет, установить его еще раз, и после этого я увидел изменения!
Полезная ссылка:
http://www.technipages.com/fix-android-app-widgets-not-appearing-on-widget-list