Урок 2: Первый виджет


И так приступим. Надеюсь разобрались с установкой библиотек и средой разроботки с первого урока. Здесь я решил написать о создание виджетов для среды android
Для начала нужно запустить проект в
Eclipse
File new Project other Android Project.
 


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

Project name: Здесь пишем имя проекта
Target Name: Выбираем в какой операционной системе будет работать (будет работать и версии выше но не ниже)
Application name:  Имя программы
Package name: Имя пакета(по умолчанию не создает, поэтому надо прописать)
Min SDK Version: Версия SDK(Ставьте 4 и выше проблем не будет)
После нажатия на Finish  откроется окно проекта где мы и будем писать нашу программу

Это структура нашего пустого проекта.
И так первым делом нужно открыть фаил main.xml он находится в layout и переделать его следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/widget_bg_normal"
    android:layout_gravity="center"
    >
<TextView 
    android:id="@+id/widget_textview"
    android:textSize="50dip"
    android:text="@string/widget_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal|center"
    android:layout_marginTop="5dip"
    android:padding="10dip"
    android:textColor="@android:color/darker_gray"
    />
</LinearLayout>
 Скорей всего в тут же получите ошибку системы:
ERROR Error: No resource found that matches the given name (at 'background' with value 
'@drawable/widget_bg_normal')
Пока не обращаем внимания, давайте сначала разберем что же мы написали

android:orientation="vertical" размещение приложения "вертикально"
android:layout_width="fill_parent" ширина на весь экран
android:layout_height="fill_parent" высота не растягивать на весь экран
android:layout_gravity="center" выравнивать по центру
android:background="@drawable/widget_bg_normal" использовать фон widget_bg_normal из папки drawable(здесь мы и получаем ошибку, папка то есть, а вот фон не создали)
Для этого нам нужно создать фон в формате png, размеров где то 300*200 и просто перетащить его в папку drawable, не забудьте дать правильное имя. Создать фон я думаю не проблема. Я создаю его с помощью фотошопа, больших знаний в нем для этого не нужно.
Все что находится между тегами <TextView.../> относится к виду текста, тут мы определяем размеры текста, шрифт, цвет.

Теперь открываем файл string.xml в папке values и правим его
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="widget_text">Hello Widget!</string>
    <string name="app_name">My Widget</string>
</resources>
тут я думаю все понятно, но все же поясню:
widget_text - пишем то что должен отображать виджет
app_name - название виджета.

Открываем файл AndroidManifest.xml, этот файл ответственный за передачу системе кода и объявление переменных

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.my.widget"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
     
      <!-- Broadcast Receiver that will process AppWidget updates -->
      <receiver android:name=".HelloWidget" android:label="@string/app_name">
            <intent-filter>
                  <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider" android:resource="@xml/hello_widget_provider" />
      </receiver>
     
    </application>
    <uses-sdk android:minSdkVersion="4" />
</manifest>
и в момент получаем ошибку так как не существует ресурс xml/hello_widget_provider.
Нам нужно его создать, для этого создаем папку xml ниже папки values и создаем там файл 
hello_widget_provider.xml
в нем пишем следующие

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
      android:minWidth="300dip"
      android:minHeight="100dip"
      android:updatePeriodMillis="10000"
      android:initialLayout="@layout/main"
/>
Описывать эти два файла я пока не буду, пока незачем.

И так скажете вы где же программирование на Java? Давайте приступим. Создаем класс HelloWidget
 
Все что нам нужно здесь прописать :-)


package com.android.hello.widget;//наш пакет


import android.appwidget.AppWidgetProvider;//вызываем библиотеку виджета

public class HelloWidget extends AppWidgetProvider{ 
//открываем пустой класс с вызовом виджета
}

На этом вроде все, осталось только запустить наш проект 
Run As - Android Application



Если вы хотите перенести ваш проект в апарат android то нужно проити в папку с проектом отуда в сам проект, выбираете папку bin и вуаля там файл helloWidget.apk

 Спасибо за внимание, продолжение следует

Java Code HelloWidget
 

azusdex

Phasellus facilisis convallis metus, ut imperdiet augue auctor nec. Duis at velit id augue lobortis porta. Sed varius, enim accumsan aliquam tincidunt, tortor urna vulputate quam, eget finibus urna est in augue.

17 комментариев:

  1. продолжайте писать в блог, очень нужная тема....

    ОтветитьУдалить
  2. Как можно на черном фоне... делать черный и синий шрифт...

    ОтветитьУдалить
  3. Да правда, фон не лучший. Изменю!

    ОтветитьУдалить
  4. Спасибо большое

    ОтветитьУдалить
  5. запись неплохая.нашел ошибку- в ява классе ты указываешь название пакета-com.android.hello.widget в то время как наш пакет называется com.android.my.widget что и в манифесте явно указано. ну не страшно ибо иде нас сама носом ткнет. спасибо за пример. продолжай в таком же духе.

    ОтветитьУдалить
  6. У меня какая-то ошибка в HelloWidgetActivity.java, мол R не может быть преобразован в переменную, хотя я делал все по инструкции.

    ОтветитьУдалить
    Ответы
    1. HelloWidgetActivity.java ты совсем не должен трогать
      где иммено?
      вставь код

      Удалить
    2. Я его и не трогал, но при изменении манифеста это и получается.
      package com.hello.widget;

      import android.app.Activity;
      import android.os.Bundle;

      public class HelloWidgetActivity extends Activity {
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      }
      }
      И еще в манифесте ошибки: на @drawable/icon и @xml/hello_widget_provider :(

      Удалить
    3. ты создал папку xml и вней файл hello_widget_provider ?
      посмотри в папке drawable (в одной из трех) если у тебя иконка называется icon, а не подругому.
      проверь еще что package="com.android.my.widget" в манефесте и в классе package com.android.hello.widget
      моя ошибка должно быть одно и тоже, поменяй в манефесте на com.android.hello.widget

      Удалить
    4. это все проверял, а иконка называется ic_launcher

      Удалить
    5. Я добавил код в низу поста, перед комментариями, скачай посмотри что не так

      Удалить
    6. Что-то я там поковырял и теперь эклипс ругается лишь при установке, т.е. в файлах ошибок нет, а он недоволен :(

      Удалить
    7. :-)
      Смотри так совсем работать перестанет

      что он хочет?

      Удалить
    8. Да ничего, просто что у меня ошибки сообщает.

      Удалить
  7. Этот комментарий был удален автором.

    ОтветитьУдалить
  8. Очень хорошая статья, но очень трудно читать из-за цветов текста.

    ОтветитьУдалить
  9. Вот-бы еще подсказали почему этот виджет запускаться не хочет?
    The application HelloWidget has stopped unexpectedly

    ОтветитьУдалить