суббота, 28 января 2012 г.

Виджет Analog Clock

Решил продолжить тему разработки под android. Так как давно не писал, то немножко подзабыл и начинаю с разминки.
На этот раз напишем виджет обычных часов.

И так начнем. Открываем Eclipse -> New -> Android Project:
Project Name: AnalogClock
Build Target: Android 2.1
Application Name: AnalogClock
Package Name: my.azusdex.analogclock
Все данные можете поменять на свои, я так назвал для удобства. Дальше нужен фон для виджета, я использовал прозрачный фон созданный в GIMP. Имя фона bg1.png и сохранен в папке проекта drawable-hdpi. Я не думаю что у вас должны возникнуть проблемы с созданием фона, на всякий случай будет в низу. После этого открываем main.xml (в папке layout кто не помнит :-)) и вносим изменения
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg1"
    android:orientation="vertical"
    android:layout_gravity="center" >

  
    <AnalogClock
        android:id="@+id/analog"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="true" />
</RelativeLayout>
 Ок, давайте разберемся что мы тут наделали.
<RelativeLayout> ... </RelativeLayout> - позволяет нам создавать объекты на фоне и привязывать к главным объектам дополнительные, в нашем случае мы создали объект часы который нужно установить в центре фона. Если бы мы создали бы еще один объект его размещение на фоне зависело бы от наших часов, то есть находился бы ближе к ним в зависимости от свободного места.
Следущие две строки, размер виджета, в данном случае не растягивем его на весь экран. Следущая строка, загрузка фона, и последние две размещение на экране.
<AnalogClock /> - собственно сами часы. Использована встроеный class AnalogClock. Тоже не чего сложного, первая сторока имя переменной, последущие две размер часов на фоне, и устанавливаем строго по середине.

Далее переходим в AndroidManifest.xml и меняем так как здесь:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.azusdex.analogclock"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
       
        <receiver
            android:name=".AnalogClock"
            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="7" />
</manifest>
 нужно для отображение виджета. Нужно также создать фаил hello_widget_provider.xml в папке xml, которую так же нужно создать (res). В этом файле мы прописываем минимальную высоту и ширину виджета
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="100dip"
    android:minHeight="100dip"
    android:updatePeriodMillis="10000"
    android:initialLayout="@layout/main"
/>
И последнее, создаем класс AnalogClock.java унаследованый от AppWidgetProvider, оставляем его пустым.
package my.azusdex.analogclock;

import android.appwidget.AppWidgetProvider;

public final class AnalogClock extends AppWidgetProvider {
   
}
Вот в принцепе и всё!!!

Ссылки на фон и саму апликацию:
AnalogClock.apk - Виджет

Спасибо! :-)

4 комментария:

  1. Анонимный25 мая 2012 г., 13:39

    Я не пойму как создать "класс AnalogClock.java унаследованый от AppWidgetProvider" пишет ошибку когда задаю Source folder - Type name is empty. Пробовал имя менять пишет - Folder 'AnalogClockk' does not exist. Пробовал создавать папку с таким же именем. Не помогает. Что делать?

    ОтветитьУдалить
  2. Анонимный25 мая 2012 г., 13:53

    ещё у меня в main.xml вот такая ошибка - error: No resource identifier found for attribute 'layout_analogParentTop' in package 'android'
    Это в пункте - element in the manifest: merge these together
    Это в


    Так же ошибка в hello_widget_provide - error: Error parsing XML: unbound prefix
    это в <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"

    Ну и в AnalogClock.java(предлагает варианты) - Move 'AnalogClock.java' to package 'my.azusdex.analogclock'
    или - Remove package declaration 'package 'my.azusdex.analogclock'

    Что мне делать?)

    ОтветитьУдалить
  3. Анонимный25 мая 2012 г., 13:58

    В main.xml, в Manifest, в hello_widget_provider.xml исправил ошибки)А вот в AnalogClock.java так и не разобрался... я думаю может что то не правильно сделал при его создании..

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