Как создать виджет для андроид

Как создать виджет для андроид

Сегодня мы разберемся в том, как создать на Android устройство свой собственный виджет (Widget). Виджет — это всем знакомый элемент рабочего стола, с помощью которого можно получать доступ к некоторым функциям какого — нибудь приложения: просматривать новости в окне виджета, прогноз погоды, обновление новостей на разных сервисах, управлять разными функциями аппарата (блокировать экран, включать радио, Интернет и многое многое другое). На этот раз мы не будем создавать чего то грандиозного и очень полезного, типа там фонарика :), а сделаем простенький виджет, который будет реализован в виде кнопки, при нажатии на которую мы, с помощью стандартного браузера, попадаем на всеми любимый сайт http://learn-android.ru. Конечно, вы сможете настроить любой желаемый вами сайт.

Создаем новые проект, выбираем Blank Activity, минимальная версия Android 2.2+. При создании виджета, первое дело — создать объект AppWidgetProviderInfo, в котором мы укажем xml файл, из которого будет заполняться вид самого виджета. Для этого, создадим в проекте папку res/xml и в ней создаем новый xml файл по имени widget.xml со следующим содержимым:

Теперь перейдем в файл activity_main.xml и создадим интерфейс нашего виджета, он будет состоять из кнопки Button:

Как видите, мы создали обычную кнопочку, вот она и будет нашим виджетом:

То есть, можете потом сделать вместо этой кнопочки все, что вам угодно.

Перейдем к работе с кодом в файле MainActivity.java. Он должен наследоваться от класса AppWidgetProvider, для которого существует его основной метод onUpdate (). В этом методе нам нужно обязательно определить два объекта: PendingIntent и RemoteViews. В конце их использования нужно вызвать метод updateAppWidget(). Код файла MainActivity.java:

Чтобы наш виджет успешно заработал, нужно немного магии в файле манифеста AnroidManifest.xml. Он должен выглядеть вот так:

Как вы догадались, виджет определяется в теге .

Единственное, что осталось подправить — отредактировать файл strings.xml, добавив туда используемые нами строчки:

Внимание! Android Studio может заругаться на вас при запуске программы, требую указать default activity. Выберите строчку «Не запускать activity» (Do not launch Activity):

Теперь устанавливаем приложение на эмулятор либо устройство, добавляем виджет на рабочий стол:

Как видите, все отлично работает.

Итак, в этом уроке мы создали простенький Android Widget, состоящий из кнопки Button, при нажатии на наш виджет мы создаем простой http запрос и переход по заданной URL ссылке. Можете поупражняться с какими-нибудь другими элементами, а не кнопкой, и придумать им интересный функционал. Удачи!

Находки программиста

Решения конкретных задач программирования. Java, Android, JavaScript, Flex и прочее. Настройка софта под Linux, методики разработки и просто размышления.

вторник, 12 июля 2011 г.

Пишем виджет для Android

Во-первых, чем виджет отчается от Activity?
Виджет работает в рамках «рабочего стола» нашего смартфона и от этого имеет как плюсы так и минусы. Плюсы: можно настроить обновление средствами системы. Интервал обновления при этом не может быть меньше получаса (180000 ms). Приложение всегда на виду: клиенту можно что-то сообщать не дожидаясь его действий. Минусы: ограниченный набор компонентов, доступных для использования в интерфейсе (из компоновщиков можно использовать только «FrameLayout», «LinearLayout» и «RelativeLayout». Из View: «AnalogClock», «Button», «Chromometer», «ImageButton», «ImageView», «ProgressBar» и «TextView». ). Также ограничено время, которое отводится на исполнение запросов. Ну, и, само собой, ограниченный размер «рабочей площади». Также достаточно сложно реализовать обработку событий в виджете: onclickListener на кнопку в виджете «повесить» не получится.

Как регистрировать виджет?
Так же как и всё остальное в нашем приложении, виджет описывается в AndroidManifest.xml. В тег application добавляем структуру:

Тут .CourceWidget — класс, описывающий виджет, widget_cource — xml файл (фактически: res/xml/widget_cource.xml), описывающий параметры виджета.

Читать еще:  Как установить гис 2 на андроид

Как описать параметры виджета?
Вот, например, так:

Тут android:minWidth и android:minHeight соответственно ширина и высота виджета. Рекомендуется приводить размеры по формуле: число пикселей = (число ячеек * 74) – 2. Одну ячейку на «рабочем столе» занимает одна иконка. Значение android:updatePeriodMillis , как уже говорили, определяет период обновления виджета в миллисекундах. В атрибуте android:initialLayout указываем ссылку на xml файл (res/layout/cource_message.xml) с описанием интерфейса виджета.

Как описать интерфейс виджета?
Вот, например, так:

Это обычный LinearLayout с четырьмя TextView, два из которых содержат строковые константы («покупка» и «продажа») а другие два заполняются данными, полученными из API. Строковые константы для поддержки «мультиязычности» выносим в файл res/values/strings.xml (значения по умолчанию — английская локализация) и res/values-ru/strings.xml (русская локализация).

Как обеспечить локализацию виджета?
Как сказано выше: вынести все константы в xml-файл вида

Exchange rate of Bitcoin
Bitcoin:USD exchange rate
Buy:
Sell:
Loading
Connect error

. и обращаться к ним как: @string/loading (вернёт «Loading»). Система сама выберет нужный файл с константами в зависимости от настроек языка в системе. В java-коде обращение к локализованным строковым константам будет выглядеть так: R.string.loading .

Как описать логику, которая должна выполняться при обновлении виджета?
Вот тут мы, наконец-то, начинаем писать java-код. Для описания логики обновления данных мы должны реализовать класс, имя которого указано в самом первом xml-конфиге, приведённом в этой статье. Это CourceWidget.java:

  1. public class CourceWidget extends AppWidgetProvider <
  2. @Override
  3. public void onUpdate(Context context, AppWidgetManager appWidgetManager, int [] appWidgetIds) <
  4. context.startService( new Intent(context, UpdateService. class ));
  5. >
  6. public static class UpdateService extends Service <
  7. @Override
  8. public void onStart(Intent intent, int startId) <
  9. RemoteViews updateViews = buildUpdate( this );
  10. AppWidgetManager.getInstance( this ).updateAppWidget( new ComponentName( this , CourceWidget. class ), updateViews);
  11. >
  12. /**
  13. * Build a widget update
  14. */
  15. public RemoteViews buildUpdate(Context context) <
  16. RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.cource_message);
  17. String buy = «» ;
  18. String sell = «» ;
  19. // get gata from JSON
  20. try <
  21. JSONObject resp = new JSONObject(Http.Request( «https://mtgox.com/code/data/ticker.php» ));
  22. buy = resp.getJSONObject( «ticker» ).getString( «buy» );
  23. sell = resp.getJSONObject( «ticker» ).getString( «sell» );
  24. > catch (Exception e) <
  25. buy = «. » ;
  26. sell = «. » ;
  27. e.printStackTrace(System.err);
  28. Toast.makeText( this , R. string .err_connect, Toast.LENGTH_SHORT).show();
  29. >
  30. views.setTextViewText(R.id.message_b, «$» + buy);
  31. views.setTextViewText(R.id.message_s, «$» + sell);
  32. return views;
  33. >
  34. @Override
  35. public IBinder onBind(Intent intent) <
  36. return null ;
  37. >
  38. >
  39. >

Наш класс расширяет AppWidgetProvider , переопределяя его метод onUpdate . В этом методе мы ничего не делаем, кроме одного: мы запускаем сервис UpdateService , описанный тут же, как вложенный класс.

Что такое сервис и зачем он нам нужен?
В контексте виджета мы не можем обращаться к сетевым ресурсам: время обновления «рабочего стола» должно быть минимальным. Сервис — это фоновый процесс, который Android исполняет в отдельном потоке настолько долго, насколько это нам нужно. Чтобы зарегистрировать сервис в AndroidManifest.xml внутри тега application добавим:

Как сервис получит данные из API?
Очень просто. Отправив get-запрос, мы получаем строку, которая на самом деле представляет собой JSON-структуру. Парсинг JSON выполняем при помощи классов org.json.* которые доступны без подключения всяких сторонних библиотек. Передаём полученную из API строку в конструктор объекта JSONObject. Методами этого объекта мы получаем вложенные объекты и их поля, т.е. значения из ответа (строки 28-30). В случае любой ошибки присваиваем переменным значения по умолчанию.

Как сервис передаёт данные в виджет?
У виджета нельзя обратиться к отдельному элементу View, чтобы изменить его свойства. Можно только заменить всю иерархию компонентов целиком. Для этого создаём объект RemoteViews (строка 21) и «вкладываем» в него полученные из API данные с помощью метода setTextViewText. Потом иерархию с установленными свойствами выдаём в виджет с помощью метода updateAppWidget (строка 13).

И напоследок: как обрабатывать нажатие на виджет?
Тут мы с сожалением вспомним удобные Listener-ы из Activity. В виджетах всё существенно сложнее. Добавим в наш класс CourceWidget константу:
public static String ACTION_WIDGET_RELOAD = «reload»;
Затем в нашем сервисе создадим событие:

Читать еще:  Как скопировать контакты с симки на андроид

Как сделать виджет в смартфоне либо планшете под управлением Android.

Как сделать виджет в смартфоне либо планшете под управлением Android.

Для того чтобы сделать виджет в Androidвовсе не обязательно уметь программировать. Есть несколько приложений-конструкторов, которые позволяют легко нарисовать виджет и дать ему нужный функционал.

Minimalistic Text

Приложение позволяет создавать минималистичные виджеты, состоящие из текста и чисел. Несмотря на название, у таких виджетов есть весьма широкие возможности.

После установки добавьте на рабочий стол виджет Minimalistic Text требуемого размера. Откроется окно настройки виджета.

В настройках можно выбрать фон, ориентирование, шрифт, действие по клику и т.д. Также в настройках есть предопределенные макеты для наполнения:

Дополнительные возможности по наполнению виджета доступны при создании своего собственного макета виджета:

  • Текст.
  • Свободное/занятое место на карте SD.
  • Время работы системы.
  • Количество переданных данных по мобильной сети и не только.
  • Название сети Wi-Fi, IP адрес в сети Wi-Fi.
  • Нагрузка на CPU.
  • Количество занятой оперативной памяти.

Все величины можно выводить в тексте и в цифрах.

Ultimate custom widget (UCCW)

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

При запуске открывается окно создания виджета. Чтобы добавить на виджет объект нажмите кнопку +/- вверху. Чтобы всяким образом перемещать и редактировать его нажмите вверху на кнопку «Select Object» и выберите добавленный объект.

На виджетах можно размещать такие объекты:

  • Время, дату и день недели.
  • Аналоговые часы.
  • Пользовательский текст.
  • Уровень заряда в цифрах или же графическое отображение оного.
  • Всю информацию о погоде — температуру, влажность, скорость ветра и т.д.
  • Геометрические фигуры.
  • Картинки.
  • Количество непрочитанных писем Gmail, sms и пропущенных звонков.
  • Время, когда зазвонит будильник.

Каждый элемент можно вращать, растягивать, сгибать и менять ему цвет. Разумеется, можно настроить действие по клику (Select Object->Hotspots). Поддерживается импорт и экспорт созданных виджетов.

Как сделать виджет в Android без программирования

Для того чтобы сделать виджет в Android вовсе не обязательно уметь программировать. Есть несколько приложений-конструкторов, которые позволяют легко нарисовать виджет и дать ему нужный функционал.

Minimalistic Text

Приложение позволяет создавать минималистичные виджеты, состоящие из текста и чисел. Несмотря на название, у таких виджетов есть весьма широкие возможности.

После установки добавьте на рабочий стол виджет Minimalistic Text требуемого размера. Откроется окно настройки виджета.

В настройках можно выбрать фон, ориентирование, шрифт, действие по клику и т.д. Также в настройках есть предопределенные макеты для наполнения:

Дополнительные возможности по наполнению виджета доступны при создании своего собственного макета виджета:

  • Текст.
  • Свободное/занятое место на карте SD.
  • Время работы системы.
  • Количество переданных данных по мобильной сети и не только.
  • Название сети Wi-Fi, IP адрес в сети Wi-Fi.
  • Нагрузка на CPU.
  • Количество занятой оперативной памяти.

Все величины можно выводить в тексте и в цифрах.

Ultimate custom widget (UCCW)

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

При запуске открывается окно создания виджета. Чтобы добавить на виджет объект нажмите кнопку +/- вверху. Чтобы всяким образом перемещать и редактировать его нажмите вверху на кнопку «Select Object» и выберите добавленный объект.

На виджетах можно размещать такие объекты:

  • Время, дату и день недели.
  • Аналоговые часы.
  • Пользовательский текст.
  • Уровень заряда в цифрах или же графическое отображение оного.
  • Всю информацию о погоде — температуру, влажность, скорость ветра и т.д.
  • Геометрические фигуры.
  • Картинки.
  • Количество непрочитанных писем Gmail, sms и пропущенных звонков.
  • Время, когда зазвонит будильник.

Каждый элемент можно вращать, растягивать, сгибать и менять ему цвет. Разумеется, можно настроить действие по клику (Select Object->Hotspots). Поддерживается импорт и экспорт созданных виджетов.

Читать еще:  Как отслеживать местоположение телефона андроид без ведома хозяина

Создание виджета для Android

Виджеты представляют собой миниатюрные приложения, которые располагаются на домашнем экране устройства под управлением операционной системой Android.

Виджеты могут показывать время, погоду, курсы валют и другую полезную информацию. Также виджеты могут выполнять какие-либо действия.

Виджеты очень удобны благодаря быстрому доступу. Однако в силу того, что размер экрана мобильного устройства весьма ограничен, использование виджетов оправдано только для отображения действительно важной информации или доступа к часто используемым функциям.

Создание виджета можно условно разделить на две части.

  1. Описание виджета;
  2. Реализация программной логики.
1.Описание виджета

Описание виджета содержит информацию о его параметрах, внешнем виде.

Описание состоит из трёх частей

  1. Объявление виджета в манифесте;
  2. Создание xml файла с основными параметрами;
  3. Создание xml файла разметки внешнего вида (интерфейса пользователя).

Объявление виджета в манифесте представляет собой секцию receiver, которая включает ключевую информацию о виджете.

А, именно (сверху вниз):

  1. Имя виджета;
  2. Интент фильтр для события, на которое будет реагировать виджет;
  3. Секция метаданных. Содержит информацию о том, что компонент, описываемый данной секцией receiver, является виджетом, а также имя xml файла с его параметрами.

Файл параметров виджета находится в папке xml и носит название имявиджета_info. Он состоит из единственной секции appwidget-provider. Параметры указываются в качестве атрибутов этого тега.

Эти параметры означают (сверху вниз):

  1. Файл разметки внешнего вида (интерфейса пользователя) для экрана блокировки (keyguard);
  2. Файл разметки внешнего вида (интерфейса пользователя) для использования в обычном режиме;
  3. Минимальная высота виджета;
  4. Минимальная ширина виджета;
  5. Изображение значка виджета для меню приложений;
  6. Возможность изменения размера виджета по горизонтали или вертикали. В данном примере включена возможность изменения размера виджета в обоих направлениях;
  7. Период обновления данных виджета в миллисекундах. Может быть указано любой число, но обновляться виджет будет не чаще 1 раза в 30 минут.

Файл разметки внешнего вида расположен в папке layout и в принципе ничем не отличается от аналогичных файлов, например, для Activity. Разве, что значения свойств ответственных за внешний вид по умолчанию адаптированы для виджета.

2.Реализация программной логики работы виджета

Виджет является наследником класса AppWidgetProvider, который в свою очередь является наследником класса BroadcastReceiver, добавляя необходимый функционал.

В классе AppWidgetProvider предусмотрена группа из пяти методов, так называемого, «жизненного цикла» виджета, которые нужно переопределить в классе, описывающем конкретный виджет.

  • onEnabled
    Вызывается только один раз, когда экземпляр виджета создаётся впервые. То есть, когда пользователь добавляет виджет на домашний экран;
  • onDeleted
    Вызывается каждый раз когда экземпляр виджета удаляется из коллекции виджетов;
  • onDisabled
    Вызывается при удалении последнего экземпляра виджета;
  • onUpdate
    Вызывается когда необходимо обновить виджет согласно временному интервалу указанному в параметре updatePeriodMillis или по команде из программы (есть альтернативный подход к обновлению);
  • onReceive
    Вызывается перед каждым из вышеперечисленных методов и при получении Broadcast Intent. Используется, в основном, для реализации обработки событий.
    Единственный из методов «жизненного цикла», который не требуется обязательно переопределять.

Главную роль в работе виджета играют два метода: onUpdate и onReceive. Именно они обеспечивают большую часть его функционала.

Как уже отмечено выше, метод onUpdate выполняет обновление виджета – отображение актуальной версии тех или иных данных виджетом, расположенным на домашнем экране устройства.

Обновление виджета достаточно сложный процесс. Но, так как он уже был подробно описан в предыдущих статьях, не станем заострять на нём внимание.

Статьи, посвящённые обновлению виджетов:

Для того чтобы обработать в коде виджета те или иные события, нужно задействовать метод onReceive и отфильтровать в нём соответствующий Intent.

Дело в том, что метод onReceive реагирует практически на все broadcast intent’ы, на которые способен реагировать данный конкретный виджет. Поэтому необходимо проверить, какой именно Intent поступил и только после этого выполнять действия.

Ссылка на основную публикацию
Adblock
detector