Intereting Posts
Возврат результата цели, когда активность закрыта кнопкой «Назад» Как я могу отслеживать внутренние местоположения? Просмотр Android DDMS недоступен в Eclipse Juno Как сделать достойный пользовательский интерфейс Настройте Gson для использования нескольких форматов даты Android: как распознать коды MICR HttpURLConnection для отправки изображений, аудио и видео файлов с параметром может (String или Json String) Android Могу ли я отображать текущую прямую трансляцию в полноэкранном приложении googleTV Null Validation в поле EditText в диалоговом окне оповещений – Android Умножение основной матрицы в OpenCV для Android Разработчик Android «Загрузите новый APK в Production 99% complete» и застрял Использование буфера с Android AudioTrack Вызов функции DialogFragment show () изнутри onRequestPermissionsResult () вызывает исключение IllegalStateException в Marshmallow OnActivityResult не вызывается Простой экспорт и импорт базы данных SQLite на Android

Добавление виджетов на страницу запуска без bindAppWidgetId ()

Я пытаюсь превратить пусковую установку ICS в автономное приложение. Я почти там – единственное, что не работает, – это значок поиска и удаление виджета на экране, что приводит к сбою.

Авария appWidgetManager.bindAppWidgetId(appWidgetId, componentName); что в пусковой установке используется appWidgetManager.bindAppWidgetId(appWidgetId, componentName); Для добавления виджетов, которые, по- видимому, имеют только системные приложения .

Итак, мой вопрос: каков правильный способ для не-системного приложения добавлять виджеты и реализовывать один и тот же опыт пользовательского интерфейса в качестве пусковой установки ICS ?

Solutions Collecting From Web of "Добавление виджетов на страницу запуска без bindAppWidgetId ()"

Timmmm,

Ваша проблема в том, что вы ищете неправильный объект. Вы не можете управлять AppWidgetManager . Это не ваша работа, ее система. То, что вы МОЖЕТЕ сделать, это управлять AppWidgetHost , для этого требуется несколько семантики. Вот основные сведения.

EDIT: дополнительный фон в процессе привязки виджета

AppWidgetManager – это одноэлементный объект, который запускается при запуске системы. Это означает, что каждый экземпляр каждой пусковой установки использует тот же AppWidgetManager. Их отличает их AppWidgetHost и RemoteViews, которые они сейчас хранят. В AppWidgetManager в основном хранится список всех активных хостов и виджетов, которые они хранят. AppWidgetHost не является привилегированным объектом. То есть любая активность может иметь один хост. Таким образом, все приложение может быть не чем иным, как виджетами, если они этого захотят.

Когда вы создаете экземпляр узла, вы должны добавить в него «Представления». Таким образом, в основном это список дочерних представлений без обязательных родительских ограничений, кроме того, что дает ваша активность. Сначала вы запрашиваете идентификатор (через myHost.allocateAppWidgetId() ). Затем вы используете свою активность / диалог виджета. Диалог возвращает WidgetInfo. Просмотр получен, когда вы попросите Хоста создать представление (через createView ) с помощью WidgetInfo и запрошенным ID. Затем он запрашивает виджет для своего RemoteView .

Наконец, вы привязываете виджет, помещая View в свою активность как ребенок. Это делается с помощью метода addView () в ViewGroup который содержит все ваши виджеты.

Процесс в действии (EDITED)

Во-первых, вы должны убедиться, что это у вас в манифесте Android:

 <uses-permission android:name="android.permission.BIND_APPWIDGET" /> 

Затем вам нужно создать AppWidgetHost (я расширяю свой собственный для своей пусковой установки). Ключом к Host является сохранение ссылки на AppWidgetManager через AppWidgetManager.getInstance(); ,

 AppWidgetHost myHost = new AppWidgetHost(context, SOME_NUMERICAL_CONSTANT_AS_AN_ID); 

Теперь, получите свой ID:

 myHost.allocateAppWidgetId() 

Следующий шаг выполняется любым способом, который вы используете для получения информации о виджетах. В большинстве случаев он возвращается через Intent через onActivityResult. Теперь все, что вам действительно нужно сделать, это использовать appInfo и создать представление. Как правило, WidgetId обеспечивается результатом активности виджета.

 AppWidgetProviderInfo withWidgetInfo = AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId); AppWidgetHostView hostView = myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo); hostView.setAppWidget(forWidgetId, withWidgetInfo); 

Теперь вы просто привязываете View как дочерний элемент к тому, к которому вы хотите привязать.

 myViewGroup.addView(hostView); 

Конечно, вам всегда нужно учитывать, где и как его разместить, и т. Д. Кроме того, вы должны убедиться, что ваш AppWidgetHost прослушивает, прежде чем начинать добавлять виджеты.

myHost.startListening()

Обобщить

Процесс привязки Widget охватывает множество методов и шагов, но все это происходит через AppWidgetHost . Поскольку Widgets закодированы вне вашего пространства имен, у вас нет никакого контроля, кроме тех случаев, когда вы их размещаете и как вы изменяете представление. Поскольку они в конечном счете являются кодом, который работает в вашем пространстве, но вне вашего контроля, AppWidgetManager действует как нейтральный посредник, в то время как AppWidgetHost служит фасилитатором от имени вашего приложения. Как только это будет понято, ваша задача проста. Вышеупомянутые шаги – все необходимые шаги для любой пользовательской пусковой установки (включая мою собственную).

EDIT: окончательное разъяснение

ICS Launcher также делает это. appWidgetManager ими appWidgetManager – это всего лишь оболочка, AppWidgetHost и вызовы AppWidgetManager . Я забыл, что об этом очень мало говорится на веб-сайте Android Development Central.

Надеюсь это поможет! Дайте мне знать, если вам нужны подробности.

FuzzicalLogic

Теперь я знаю окончательный ответ. В Android 4.0 вы не можете этого сделать. Я закончил тем, что мои пользователи дважды выбирали виджет, который отстой, но вокруг этого нет.

В Android 4.1 они исправили проблему!

Приложения SDK теперь могут размещать виджеты и не использовать API-интерфейс для выбора виджетов мусора! Вы можете заглянуть в исходный код Jellybean Launcher2, но в основном, когда вы сначала пытаетесь связать виджет, Android выведет диалоговое окно с надписью «Вы хотите разрешить этому приложению связывать виджеты», а затем пользователь может Решите дать ему разрешение или нет.

Я не уверен, почему они пошли для диалогового окна предоставления разрешений на использование мода, а не для модели all-permissions-on-install, которую они использовали для всего остального, но что бы это ни было!

Теперь нам просто нужно ждать 4 или 5 лет, пока у всех нет Android 4.1 или выше!

Я только что нашел этот урок о том, как добавлять приложения в обычные приложения, что может помочь: http://coderender.blogspot.com/2012/01/hosting-android-widgets-my.html

В этом учебнике по-прежнему используется список «AppWidget Picker», поэтому он может не сработать для вас, так как ICS имеет средство выбора виджетов внутри самого ящика приложения.

Тем не менее, стоит отметить, поскольку учебники по размещению виджетов очень редки 🙂

Ура,
Yuvi

Fuzzical Logic, с вашим кодом ниже,

 AppWidgetProviderInfo withWidgetInfo = AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId); AppWidgetHostView hostView = myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo); hostView.setAppWidget(forWidgetId, withWidgetInfo); 

Если у вас нет разрешения bind_widget, widgethost ничего не получил, cus withwidgetinfo имеет значение null, widgethost ничего не создает.