Создание Widget - делаем виджет на Android устройство
Создание Widget - делаем виджет на Android устройство
Главная » Создание Widget - делаем виджет на Android устройство

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

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

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:minWidth="146dp"
 android:updatePeriodMillis="0"
 android:minHeight="146dp"
 android:initialLayout="@layout/activity_main">
</appwidget-provider>

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="top"
 tools:context=".MainActivity" >
 <Button
 android:id="@+id/button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginLeft="5dp"
 android:text="@string/app_name" />
</LinearLayout>

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

Вид интерфейса

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

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

import android.net.Uri;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.Toast;
import com.example.widget.R;

public class MainActivity extends AppWidgetProvider{

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
 int[] appWidgetIds) {
 for(int i=0; i<appWidgetIds.length; i++){
 int currentWidgetId = appWidgetIds[i];

 //Делаем простой http запрос на указанную ссылку и выполняем по ней переход:
 String url = "http://learn-android.ru";
 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 intent.setData(Uri.parse(url));

 //Определяем два обязательных объекта класса PendingIntent и RemoteViews:
 PendingIntent pending = PendingIntent.getActivity(context, 0,intent, 0);
 RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main);

 //Настраиваем обработку клика по добавлению виджета:
 views.setOnClickPendingIntent(R.id.button, pending);
 appWidgetManager.updateAppWidget(currentWidgetId,views);
 Toast.makeText(context, "Виджет добавлен", Toast.LENGTH_SHORT).show();
 }
 }
}

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.widget"
 android:versionCode="1"
 android:versionName="1.0" >
 <uses-permission android:name="android.permission.INTERNET"/>
 <application
 android:allowBackup="true"
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:theme="@style/AppTheme" >

 <receiver android:name="home.study.MainActivity" >
 <intent-filter>
 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
 </intent-filter>
 <meta-data android:name="android.appwidget.provider"
 android:resource="@xml/widget" />
 </receiver>
 
 </application>
</manifest>

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

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string name="app_name">LEARN.ANDROID</string>
 <string name="action_settings">Settings</string>
 <string name="hello_world">Hello world!</string>
</resources>

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

Аккуратно с activity

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

Виджет на рабочем столе

И жмем по нему:

Перешли с widget на сайт

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

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

Категория: Уроки программирования | Просмотров: 3029 | Добавил: Oleg | Теги: widget на Android, виджет, Widget, Android программирование | Рейтинг: 3.5/2
Всего комментариев: 4
avatar
1
Не работает.
Точнее работает не так как надо.
Виджет в списке виджетов есть, но сам виджет представляет из себя пустой и полностью прозрачный квадрат 3х3 БЕЗ КНОПКИ и не реагирующий на нажатия.
Иными словами виджет как кот Шрёдингера: "он есть и он нет".
avatar
0
2
У меня все работало 100%. Посмотрите, может что то пропустили на каком нибудь шаге, внимательно пересмотрите. Тестировалось на Android 4,2, работало, скриншоты в уроке в подтверждение.
avatar
3
Всё работает. Помогите новичку, как сделать так, чтобы при клике на виджет переходило не на сайт какой-либо, а на другую Activity?
avatar
4
спасибо!
avatar