Kashiash's Blog

o programowaniu inaczej : jak zrobić i się nie narobić

Archive for the ‘Android’ Category

Sprawdzanie poprawności wprowadzonych danych

Posted by kashiash w dniu 6 lutego, 2011

Clarion posiada możliwość deklaracji kontroli poprawności danych

Na zakładce Validate Fields możemy wybrać kilka opcji. MOBY korzysta z niektórych z nich:

MUST BE IN TABLE – oznacza ze wartość z tej kolumny musi znajdować się w tabeli w relacji. MOBY pilnuje zaraz po wprowadzeniu wartości czy jest poprawna

CANNOT BE ZERO OR BLANK – w polu musi być cokolwiek wpisane

MUST BE IN RANGE – wartość musi znajdować się w wartościach podanych w tej opcji

Dodatkowo można wypełnić opcje VALIDATE i wpisać w niej wyrażenie logiczne zgodne z syntaktyka języka JAVA, które musi być spełnione, aby można było zapisać dane.

Posted in Android, Clarion, MOBY | Leave a Comment »

Ewidencja pojazdów: Policzmy to i owo ;)

Posted by kashiash w dniu 6 lutego, 2011

Standardowo clarion ma cos takiego jak Formuły, gdzie możesz zdecydować co ma być liczone , jak i kiedy. Niestety zrobienie tego w DCT jest dużo trudniejsze. Uważam, że nie należy robić nic na siłę. Moby I pozwala jedynie na określenie formuł wypełniających poszczególne pola, jakieś specyficzne wyliczenia trzeba zakodować ręcznie. Uspokajam – MOBY II będzie pozwalał na definiowanie formuł w sposób podobny do clarion’a.

Prosta aplikacja, którą próbujemy tu zrobić ma rejestr pojazdów oraz rejestr ich tankowania. Podczas tankowania użytkownik będzie wpisywał stan licznika z momentu tankowania. Możemy ta informacje wpisywać do pola odometer w naszych pojazdach, przez co będą aktualizowane automatycznie.

Jak to zrobić ?

Prostym zapytaniem SQL jesteśmy w stanie pobrać najwyższa wartość stanu licznika dla wybranego pojazdu. Poniżej przypominam strukturę bazy danych.

Pytamy o maksymalna wartość licznika w logu, np. tak :

Select max(EndingOdometer) from FuelLog where Vehicle = 1

Operacje wykonujemy na oknie VehiclesEdit, gdzie id naszego pojazdu możemy pobrać z obiektu reprezentującego rekord z tabeli Vehicles:

Możemy się do niego dostać używając metody getId :


VehiclesRecord.getId()

Czyli nasze zapytanie bedzie wyglądalo tak :

„Select max(EndingOdometer) from FuelLog where Vehicle = ” + VehiclesRecord.getId()

a takie zapytanie wywołamy w następujący sposób:

VehiclesxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = ” + VehiclesRecord.getId());

aby wpisywalo sie do naszego pola należy wpisać w opcjach pola EndingOdometer EVALUATE oraz EVALUATECONDITION.

EVALUATE(VehiclesxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = ” + VehiclesRecord.getId()))

EVALUATECONDITION( VehiclesRecord.getId() != null)

Dzięki tym opcjom MOBY wygeneruje kod który pod warunkiem spełnienia warunku w EVALUATECONDITION wpisze wynik z EVALUETE do pola EndingOdometer


public
void DoLookups() {


if (VehiclesRecord.getId() != null) {


VehiclesRecord.setOdmoter(VehiclesxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = „ + VehiclesRecord.getId()));


// Vehicles Veh:Odmoter


if ( VehiclesRecord.getOdmoter() != null) {


mOdmoterText.setText(VehiclesRecord.getOdmoter().toString());

}

}

}

Uruchamiamy aplikację, wybieramy pojazd, wchodzimy do jego edycji i robimy wpis do logu tankowania, wracamy na dane i pojazdu i …? cieszymy się jak nasz log się aktualizuje.

Skoro poznaliśmy kolejną, istotną możliwość MOBY, wykorzystajmy ja dalej: w logu tankowania przydałoby się, aby stan licznika poprzedniego tankowania był automatycznie podpowiadany, przy okazji niech, jako licznik kończący wpisze się ta sama wartość i oczywiście wyliczy się różnice przejechanych kilometrów.

Robimy to bardzo podobnie jak wcześniej, zmieniamy tylko klauzulę where – mamy wyszukać maksymalna wartość z licznika dla wpisów wcześniejszych niż edytowany. W EVALUATE wpiszemy wyrażenie wyliczające maksymalny licznik z wcześniej wpisanej pozycji

FuelLogxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = ” + FuelLogRecord.getVehicle() + ” and _id < ” + FuelLogRecord.getId())


Dzięki temu pole StartingOdometer będzie automatycznie uzupełniane.

W kolejnym kroku wprowadzimy wypełnianie EndingOdometer w sytuacji gdy jest puste. Dodatkowo włączymy opcje SPINNABLE, co spowoduje ze MOBY doda 2 przyciski, które pozwalają zwiększać lub zmniejszać wartość tego pola.


UPDATECONTROLS powoduje ze po aktualizacji tego pola pozostałe są ponownie wyliczane, i pole OdometerChange zostanie przeliczone wg zadeklarowanego wyrażenia w EVALUATE.


Wchodzimy do edycji pojazdu, jak widacz licznik jest 6809


Teraz dopisujemy tankowanie, podpowiada nam się Starting i Ending Odometer, zmieniając wartość w Ending Odometer, automatycznie wylicza nam się OdometerChange


Po zapisaniu informacji o tankowaniu w pojeździe automatycznie zaktualizuje nam się Licznik bieżacy



Posted in Android, Clarion, MOBY | Leave a Comment »

Ewidencja pojazdów – dopieszczanie interfejsu

Posted by kashiash w dniu 5 lutego, 2011

O atrakcyjności aplikacji decyduje wygląd interfejsu. Niestety interfejs androida nie jest „sexy” i np. odbiega od tego co oferuje iPhone czy aplikacje robione w Adobe Air/Flex. Bolączką wielu programistów, niestety także autora tego tekstu jest brak smykałki do dopracowywania wyglądu interfejsu. Na szczęście Moby dostarcza kilka predefiniowanych szablonów wyglądu list danych. Oto opis jak ich używać.

Dla każdej tabeli możemy zdefiniować layout alternatywny. Najprostszy z nich to Layout 3 zawierający linijke tekstu oraz ikonkę pozwalającą wyświetlać ikonkę, która zależy od zawartości rekordu listy.

Układ graficzny nr 3

LeftIconField

UpTextField

RightIconField

LoTextField

Aby uzyskać taki wygląd należy w FileUserOptions dodać opcje typu Number o nazwie ALTROWLAYOUT i wpisać jej wartość 3

Oraz określić, jakie pole ma być wyświetlane w UpTextField w przypadku tabeli Dostawców paliwa wybieramy pole Brand, co oznacza , że w polu górnym widoku ma być wyświetlona wartość kolumny Brand z tabeli którą edytujemy czyli w tym przypadku Brands.

Dodatkowo określamy jak ikonka powinna być wyświetlona w LeftIconField podajemy wyrażenie zgodne ze składnia języka JAVA, którego wynik daje nazwę ikonki.

Podobnie robimy w tabeli Makes

Oraz w tabeli Models

Wykaz ikonek potrzebnych dla naszej aplikacji – zawartośc katalogu res\drawables

Układ graficzny nr 3 wersja rozbudowana

Aby pokazac układ bardziej rozbudowany, zmodyfikujemy nieco tabelę z dostawcami paliwa – dodamy pole z informacja czy akceptują karte paliwowa UTA

W ten sposób definiujemy pole typu CHECKBOX

Generujemy aplikację. W związku z tym, że zmieniła nam się struktura bazy, modyfikujemy numer wersji bazy danych. Dzięki tej informacji MOBY wygeneruje procedurę do konwersji z poprzedniej wersji, na wersje bieżącą.

Ustawiamy dodatkowe opcje jak poniżej:

Dodajemy opcje związane z informacja o prawej ikonce

RightIconField(„uta” + BrandsxDbAdapter.getAcceptUTACards(c))

Do projektu wgrywamy ikonkę uta1.png

Układ graficzny własny … tzn. ręcznie dziergany

Zmieniamy vehicles_list.xml na:

<?xml version=”1.0″ encoding=”utf-8″?>

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;

android:id=”@+id/RelativeLayout01″

android:layout_height=”wrap_content”

android:layout_width=”fill_parent”>

 

<ImageView android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/lefticon”

android:visibility=”gone”></ImageView>

 

 

<TextView

android:layout_width=”wrap_content”

android:text=”TextView”

android:padding=”5dp”

android:textAppearance=”?android:attr/textAppearanceMedium”

android:layout_height=”wrap_content”

android:id=”@+id/model”

android:layout_toRightOf=”@+id/lefticon”

android:layout_alignTop=”@+id/lefticon”

android:layout_alignBottom=”@+id/lefticon”>

</TextView>

 

<TextView

android:layout_width=”wrap_content”

android:text=”TextView”

android:textAppearance=”?android:attr/textAppearanceMedium”

android:layout_height=”wrap_content”

android:id=”@+id/odmoter”

android:padding=”5dp”

android:layout_alignParentRight=”true”>

</TextView>

<TextView

android:layout_width=”wrap_content”

android:text=”TextView”

android:padding=”5dp”

android:textAppearance=”?android:attr/textAppearanceMedium”

android:layout_height=”wrap_content”

android:id=”@+id/plateno”

android:layout_centerInParent=”true”

></TextView>

 

</RelativeLayout>

W VehiclesList.java odszukujemy procedure VehiclesHolder

I zmieniamy, aby wyglądała jak poniżej

static class VehiclesHolder {

 

private TextView Odmoter = null;

private TextView Model = null;

private TextView PlateNo = null;

private ImageView LeftIcon=null; //manual

private View row=null;

VehiclesHolder(View row) {

this.row=row;

 

LeftIcon=(ImageView)row.findViewById(R.id.lefticon);

Odmoter=(TextView)row.findViewById(R.id.odmoter);

Model=(TextView)row.findViewById(R.id.model);

PlateNo=(TextView)row.findViewById(R.id.plateno);

 

}

 

void populateFrom(Cursor c) {

if (VehiclesxDbAdapter.getOdmoter(c) != null) {

Odmoter.setText(VehiclesxDbAdapter.getOdmoter(c).toString());

}

if (VehiclesxDbAdapter.getModel(c) != null) {

Model.setText(VehiclesxDbAdapter.getModel(c).toString());

}

if (VehiclesxDbAdapter.getPlateNo(c) != null) {

PlateNo.setText(VehiclesxDbAdapter.getPlateNo(c));

}

int resId;

try {

resId = R.drawable.class.getDeclaredField(„makes” + VehiclesxDbAdapter.getMake(c).toLowerCase()).getInt(null);

LeftIcon.setImageResource(resId);

LeftIcon.setVisibility(View.VISIBLE);

} catch (Exception e) {

Log.d(TAG,”ikona:” + „makes” + VehiclesxDbAdapter.getMake(c).toLowerCase());

LeftIcon.setVisibility(View.INVISIBLE);

}

}

}

Oczywiście podczas kolejnego generowaniaclarion nadpisze nam nasze zmiany. Aby temu zapobiec, zabronimy generowanie kodu listy oraz layoutu wiersza listy

FreezeListLayout(true) oraz FreezeList(true)

Posted in Android, Clarion, MOBY | Leave a Comment »

Ewidencja pojazdów – nowe tabele

Posted by kashiash w dniu 29 stycznia, 2011

Skoro ma być to ewidencja pojazdów to przydałoby się w niej przechowywać informację o wydatkach z tym pojazdem związanych.

W tym celu dodamy FuelLog oraz 2 tabele słownikowe na koncern paliwowy i rodzaj paliwa :

FuelLog
PkFuelLog KEY(Ful:Id),DUP,NOCASE
KeyVehicle KEY(Ful:Vehicle),DUP,NOCASE
KeyBrand KEY(Ful:Brand),DUP,NOCASE
KeyFuelType KEY(Ful:FuelType),DUP,NOCASE
Kolumny
Id LONG
Vehicle LONG
FillUpDate DATE
Quantity REAL
TotalCost REAL
Notes STRING(100)
StartingOdometer LONG
EndingOdometer LONG
OdometerChange LONG
Brand LONG
FuelType LONG
Brands
PkBrands KEY(Bra:Id),DUP,NOCASE
KeyBrand KEY(Bra:Brand),DUP,NOCASE
Kolumny
Id LONG
Brand STRING(51)
FuelTypes
PkFuelTypes KEY(Fty:Id),DUP,NOCASE
KeyFuelType KEY(Fty:FuelTypes),DUP,NOCASE
Kolumny
Id LONG
FuelTypes STRING(50)

Do tego określimy relacje pomiędzy tabelami :

FuelTypes <->> FuelLog

Vehicles <->> FuelLog

Brands <->> FuelLog

I W tabeli w zakładkach Validate check ustawimy odpowiednio wpisy w must be in file dla poł Vehicle, Brand i FuelType

Ustawiamy dla nich UseSpinner i DSP dla wyżej wspomnianych kolumn

 

W efekcie końcowym dostaniemy strukturę bazy jak poniżej:

Zapisujemy i generujemy kod naszej aplikacji.

Doszły nam 3 nowe tabele i potrzebujemy dla nich ikonek. Bez nich nie uda nam się uruchomić aplikacji.

Potrzebujemy brands.png, fuelstypes.png oraz fuellog.png, które należy wgrać do katalogu res/drawables.

Uruchamiamy nasza aplikację i naszym oczom powinien pojawić się następujący widok:

Jak widać zaczyna nam brakować miejsca, w pewnym stopniu pomogłoby zmniejszenie ikon z 48×48 na mniejsze, albo nie pokazywanie wszystkich tych przycisków na głównym menu aplikacji. Tym tematem zajmiemy się później, teraz popatrzmy co nam wyszło ;).

Ewidentnie mamy problem z miejscem, ale mamy w końcu nieocenionego MOBY!

W File User Options ustawiamy PromptsInLine(true) po przegenrowaniu:

To samo możemy ustawić na Vehicles : PromptsInLine(true).

W obecnej wersji aby wejść do listy z zakupami mieliśmy 2 możliwości: albo wchodzimy prosto z menu, albo z pojazdu poprzez przycisk menu.

Jeśli ustawimy UseTabHost(true) w FileUserOptions dla Vehicles, to program wygeneruje kod tak, że lista będzie widziana także na osobnej zakładce w oknie edycji pojazdu



W kolejnych krokach popracujemy nad listą danych wyswietlanych w pojazdach i logu tankowań, na razie pobawcie się nowa aplikacją androidową

Dlaczego to nie chce mi się skompilować ?

Jeśli otrzymujemy komunikat ze nasz projekt zawiera błędy i nie możemy go uruchomić zaglądamy na zakładkę PROBLEMS

poniżej przykład komunikatu na który pomaga wyczyszczenie projektu

Walkę ze wszystkimi problemami proponuje zaczynać od operacji wyczyszczenia projektu:

wybieramy Project/Clean i obserwujemy, co się wyświetla na zakładce Problems

komunikat najbardziej prawdopodobny w aplikacja wygenerowanej przez MOBY – brakuje nam ikonek.

Wgrywamy o wymaganej nazwie do katalogu res/drawables i powinno być po sprawie

Posted in Android, Clarion, MOBY | Leave a Comment »

MOBY Notepad example

Posted by kashiash w dniu 21 stycznia, 2011

Na stronie Android Developers jest tutorial jak zrobić prosta aplikację. Dla zainteresowanych tu:

http://developer.android.com/guide/tutorials/notepad/index.html

Przeszedłem tego tutoriala, zabrało mi to ok 2 godzin (trochę walczyłem z błędami jakie popełniłem podczas pisania kodu). Podobno to nawet niezły wynik jak na kogoś kto nigdy nc w javie nie napisał.

Poniżej tutorial jak zrobić to w MOBY. Dla porównania: średnio rozwinięta osoba robiła to 15 minut 😉 w tym najwięcej czasu pochłonęło znalezienie odpowiednich ikonek.

W dct tworzymy prosta tabele, nazywamy ją Notepad, definiujemy następujące pola:

Id LONG ! ważne Nazwa tego pola musi być dokładnie jak podana (id, ID iD są niepoprawne)

Title STRING(20)

Notes STRING(20)

NoteDate DATE ! w Initial value wpisujemy clarion.today()

Zakładamy indeksy

PkNotes (Id)

KeyTitle(Title) ! warto dodać opis – generator użyje go w aplikacji zamiast nazwy klucza

Zapisujemy DCT, tworzymy pusta aplikację o nazwie Notepad dla której wybieramy wcześniej stworzone dct

Po otwarciu app uruchamiamy Utility template Clarion2Android i naciskamy OK

Wartości domyślne są odpowiednie dla generowanej aplikacji, dlatego nie modyfikujemy ich. W dalszej części dokumentacji będzie opisane do czego odpowiednie opcję służą.

W tym czasie zostanie wygenerowany nasz projekt androidowi, który należy skompilować. W tym przypadku użyjemy do tego Eclipse.

Wybieramy File/ New/ Project na oknie wybieramy Android Project. Wybieramy Create project from existing source. W polu Location podajemy ścieżkę do wygenerowanego przez szablon katalogu. I Naciskamy Finish.

Nasz projekt potrzebuje kilka ikon, które należy wgrac do katalogu res\drawable

Wszystkie ikony I obrazki powinny mieć nazwy pisane małymi literami.

flip.png – jest to domyślny plik tła dla wszystkich okien, jeśli podczas generowania podałeś inną nazwę, to należy wgrać odpowiedni plik.

Dla każdej tabeli w zdefiniowanej projekcie potrzebna jest ikonka o takiej samej nazwie jak tabela. W tym przypadku notepad.png oraz ikonke aplikacji która nazywa się application.png

Dodatkowo każdy projekt potrzebuje takich ikon:

ic_menu_preferences.png, ic_menu_add.png, ic_menu_search.png, dialog_alert.png, ic_menu_close_clear_cancel.png, ic_menu_save.png, exchange.png, ic_menu_delete.png

Po wgraniu ikon w Eclipse wybieramy Project /Clean wskazujemy nasz projekt i naciskamy OK. Opcja ta służy do usuwania plików tymczasowych projektu, ale jednocześnie wymusza na eclipse wygenerowaniu wszystkich wymaganych przez niego plików.

Nastepnie wybieramy: RUN/ Run as android application. W tym czasie Eclipse weryfikuje nasza aplikacje I uruchamia emulator. W zależności od prędkości komputera emulator uruchamia się od 40 sekund do ponad 2ch minut. Podczas dalszej pracy nie zamykaj emulatora dzięki temu oszczędzisz czas jaki jest potrzebny na jego uruchomienie. Po uruchomieniu zobaczysz ekran startowy jak poniżej, przesuń myszką pasek z zieloną kłódka w prawo, co spowoduje odblokowanie ekranu.

I naszym oczom pokaże się aplikacja w androidzie

Wybieramy Browse Notepad, pojawia się puste okienko gdzie będziemy widzieć wpisane notatki. Wybieramy klawisz Menu na oknie emulatora i wybieramy Add, pojawia się ekran gdzie możemy wpisać notatkę.

Posted in Android, MOBY | Leave a Comment »

Opcja dzwonienia na numer z kontrolki Text Edit : PhoneButton Option

Posted by kashiash w dniu 20 stycznia, 2011

Dodaliśmy w MOBY możliwość dodania przycisku do dzwonienia na numer wpisany w polu. Wystarczy w UserOptions dodać PhoneButton (True)

Dzięki temu wpisowi generator w kodzie doda taki wpis:

[java]

mTelefonText = (EditText) findViewById(R.id.autologTelefon);

Button CallPhoneTelefon = (Button)findViewById(R.id.CallPhoneTelefon );

CallPhoneTelefon.setOnClickListener(new OnClickListener(){

public
void onClick(View arg1){

String toDial=„tel:”+mTelefonText.getText().toString();

if (toDial.length()>4) {

startActivity(new Intent(Intent.ACTION_DIAL,Uri.parse(toDial)));

}

}

});

[/java]

Co w efekcie da nam w aplikacji:


I po naciśnięciu przycisku ze słuchawką


Posted in Android, Clarion, MOBY | Leave a Comment »

Błąd w Java SDK 1.5! – The method onClick(View) of type new View.OnClickListener(){} must override a superclass method

Posted by kashiash w dniu 19 grudnia, 2010

Problem który zmarnował mi kilka godzin jakże cennego życia:

dla kodu:
mAgreementDateText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
pickDate((Button) v);
}

pojawiał sie komunikat :
The method onClick(View) of type new View.OnClickListener(){} must override a superclass method.

Okazalo się że Java SDK 1.5 ma problem z override. Trzeba dla projektu wejsc do Properties (Ctrl-Enter) i zmienić Java compiler na 1.6 i włala

jednak moja podświadoma niechęć do javy i eclipsa ma swoje uzasadnienie 😉

Posted in Android, Google Apps | 4 Komentarze »