вторник, 22 февраля 2011 г.

Урок 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
 

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

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

    ОтветитьУдалить
  2. Анонимный5 июля 2011 г., 1:18

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

    ОтветитьУдалить
  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

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