Виджет 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 - Виджет

Спасибо! :-)

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.

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

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

    ОтветитьУдалить
  2. ещё у меня в 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. В main.xml, в Manifest, в hello_widget_provider.xml исправил ошибки)А вот в AnalogClock.java так и не разобрался... я думаю может что то не правильно сделал при его создании..

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