Ответ 1
Проблема была android:installLocation="preferExternal"
Это как-то вызывает проблему с списком виджетов, если приложение установлено на SD
Я обновляю свое приложение с помощью виджета. Это не первый виджет, который я сделал. Я всегда сталкивался с странными проблемами, но виджет в конечном итоге перерастал в список.
Вот что я сделал до сих пор:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="110dp" android:minHeight="30dp" android:updatePeriodMillis="86400000" android:initialLayout="@layout/widget_layout" android:resizeMode="none"> </appwidget-provider>
<application>
(по какой-то причине он не может вставлять фрагмент манифеста здесь, он просто не отображается, см. код здесь)Тем не менее, не удается найти виджет в списке виджетов. Я отлаживаю приложение на реальном устройстве. Я использую проект библиотеки, но файлы виджета, но все в проекте я запускаю напрямую. Что может быть здесь?
Проблема была android:installLocation="preferExternal"
Это как-то вызывает проблему с списком виджетов, если приложение установлено на SD
Пробегайте через похожие проблемы, и это то, что произошло для меня. Следующий виджет никогда не появлялся в ящике Widget до добавления minResizeHeight. Странно, но может быть, это необходимо для изменяемого размера виджета. Возможно, было более дружелюбно.
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/pmt_schedule_scroll_widget"
android:minHeight="146dip"
android:minResizeHeight="73dp"
android:minWidth="146dip"
android:resizeMode="vertical"
android:updatePeriodMillis="0" />
Такая проблема может произойти с двумя сценариями. Оба ответа выше, и это полный ответ, и я столкнулся с обоими сценариями и разрешил их оба.
Если приложение указывает параметр android: installLocation = "preferExternal" в манифесте, приложение будет установлено во внешнюю память и оно не будет отображаться в списке виджетов. Также, если вы установили свой телефон для установки всех приложений на SD-карте, это также произойдет.
Перейдите в Настройки- > Приложения- > YourApp Затем перейдите к телефону. Это переместит приложение в память телефона и теперь вы увидите виджет в списке виджетов
Если указанное исправление не решило вашу проблему, возможно, у вас есть устройство с версией android 4.X.X.
Затем вы должны установить по крайней мере следующие параметры в файле widget_info.xml
Android: MinHeight = "XXXdp" андроид: MinWidth = "XXXdp"
Вам необходимо зарегистрировать BroadcastReceiver в файле манифеста. Например:
<receiver
android:icon="@drawable/icon"
android:label="Example Widget"
android:name="MyWidgetProvider" >
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
</receiver>
Я взял этот код из http://www.vogella.com/articles/AndroidWidgets/article.html
См. ссылку для полного учебника
Я пробовал все возможные решения, и ничего не работало для меня... И, наконец, я решил это.
В моем случае проблема была чрезмерной: я считал, что в теге метаданных нам нужно определить уникальное имя для провайдера (например: "com.example.myprovider" ), а также ссылку к ресурсу xml.
Неправильно:
<meta-data
android:name="com.example.myprovider"
android:resource="@xml/widget_info" />
Справа:
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
после нескольких часов поиска и неспособности решить проблему, я решил открыть образец проекта виджета, который работает и идет сравнение элемента по позиции, чтобы увидеть, что было не так, в конце концов, я решил добавить следующие строки в мой res/XML/widget_info.xml:
android:minHeight="XXXdp"
android:minResizeHeight="XXXdp"
android:minResizeWidth="XXXdp"
android:minWidth="XXXdp"
где XXX - некоторое значение.
В моем случае проблема была в фильтре намерений в приемнике.
Неправильно:
<intent-filter>
<action android:name="APPWIDGET_UPDATE" />
</intent-filter>
Правильный:
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>