No to zaczynamy, daj się poznać!

Jakiś czas temu dotarła do mnie informacja, o bardzo ciekawym konkursie, który wymyślił Maciej Aniserowicz. W największym skrócie, zobowiązujemy się, że będziemy pisali dwa posty tygodniowo, oraz rozwijali projekt open source publikując kod na Github. Zobowiązujemy się do tego przez okres 10 tygodni, czyli musi się pojawić minimum 20 postów projektowych. Mówiąc szczerze, bardzo duże wyzwanie, do tej pory nie raz nie pojawiały się nawet 2 wpisy miesięcznie 😉 Cóż będzie trudno, ale skoro jest trudno tzn, że kierunek powinien być prawidłowy 😉

Projekt który w ramach konkursu będę rozwijał został również zgłoszony na inny konkurs (combo;) Projekt nazywa się E-lementarz i bierze udział również w x-prize. Jest to konkurs ogólnoświatowy, chodzi o stworzenie aplikacji która pozwoli się uczyć dzieciakom, które nigdy nie miały styczności z technologią, może nawet z klasyczną edukacją.. Projekt wygląda trochę jak eksperyment „computer in the wall”, po zakończeniu przyjmowania zgłoszeń, komisja wybierze najlepsze aplikacje które zostaną preinstalowane na tabletach, które trafią do dzieciaków. Za jakiś czas nastąpi porównanie wyników i wtedy będzie jasne, czy projekt zakończył się sukcesem, czy nie 😉 Nie jestem jedyną osobą biorącą udział w projekcie, ale na czas trwania, pisanie spada na mnie, a że postanowiliśmy po raz kolejny zacząć od początku, mam w pełni wolną rękę 😉 Przy okazji, na 198 zgłoszonych drużyn, jesteśmy jedyni z Polski.

Trochę może o metodyce, zagadnienie jest trudne, ponieważ osoby do których trafią urządzenia, mogły nie mieć nigdy wcześniej styczności z edukacją. Postanowiliśmy, że będziemy się trzymali założeń pedagogiki opracowanych przez M. Montessori. Metoda polega na tym, że wykorzystuje dziecięcą ciekawość do nauki konkretnych umiejętności. Na ile to podejście okaże się skuteczne, nie mamy pojęcia, ale postanowiliśmy podążać tą drogą 😉

Tyle tytułem wstępu, wkrótce pojawią się kolejne posty, będę starał się omawiać pomysł na daną funkcjonalność, implementację i dlaczego wygląda to właśnie w ten sposób 😉 Mam nadzieję, że będzie ciekawie, złożoność zagadnienia nie tylko od strony implementacyjnej jest ogromna 😉

Projekt na Github.

Pozdrawiam!

Kurs programowania android, czyli jak wzorowo się podłożyłem ;)

W swoim poprzednim poście informowałem o kursie programowania na platformę Android, który zrobiłem, dzisiaj niestety muszę napisać, że znajdował się w nim spory błąd. Wykorzystajmy to jednak, aby nauczyć się czegoś nowego 😉 Przejdę od razu do rozwiązania, w metodzie która ustawiała kolor paska na dole użyłem metody getColor() co było błędem. Metoda ta została zaimplementowana dopiero w Androidzie 6.0, z kolei do góry znajdował się warunek, jeśli wersja systemu jest większa niż 5.0. W związku z tym wszystkie lizaki miały problem z uruchomieniem aplikacji. Pierwszym rozwiązaniem o którym pomyślałem było zwiększenie warunku, jeśli wersja systemu M lub wyżej, to ustawiaj kolor paska. Ale było to jednak bez sensu, ponieważ kolor paska możemy ustawiać już w 5.0, w związku z skorzystałem z wycofanej metody: (this.getResources().getColor(R.color.colorPrimaryDark) która działa na wszystkich wersjach systemu 😉 Korzystając z okazji, że i tak dłubię w kodzie dodałem jeszcze adnotację: @TargetApi(23) metodom które podświetlały się na czerwono. One i tak były wywoływane tylko w sytuacji kiedy korzystaliśmy z Androida Marshmallow, ale w ten sposób IDE nie informuje nas, że może wystąpić w tamtym miejscu błąd.
A teraz pokażę jak doszedłem do rozwiązania tego problemu. W tym miejscu wypada podziękować użytkownikowi: „Jem ciastka”, który napisał taką opinię:

Swoją drogą, całkiem sporo możemy się dowiedzieć o użytkownikach, którzy pobrali naszą aplikację. Na początku nie bardzo uwierzyłem w to co się stało, dopóki nie zajrzałem do sekcji błędów…
Prawda, że przyjemna sekcja? 😉 Wydedukowałem o co chodzi, poprawiłem, przetestowałem na emulatorze i opublikowałem poprawkę. Cóż, popełniłem głupi błąd, za który wypada mi przeprosić. Dobrze, że instalacji jest póki co mało, dzięki temu mało osób ucierpiało. Wrzuciłem zmianę na githuba i aktualizuję aplikację w sklepie Play.
Na koniec wypada mi jeszcze napisać, cóż, błędy się zdarzają 😉 Nie warto się z tego powodu załamywać, trzeba jednak starać się za każdym razem jak najlepiej je poprawić. Nie mniej, mam nadzieję, że to jedyna poważna wtopa w tym kursie 😉
Pozdrawiam!

Kurs programowania Android

Z wielką radością informuję, że wspólnie z Kenis.pl udało się przygotować i uruchomić kurs programowania na platformę Android:
Kurs programowania android

Mam nadzieję, że okaże się pomocny i wprowadzi w bardzo ciekawy świat programowania na tą platformę. Razem z kursem została wydana aplikacja:

Kenis Toys

Co jakiś czas pewnie będę wyświetlał tą statystykę i rozszerzał informacje które znalazły się w tym kursie, jestem otwarty na propozycje, które tematy mam poruszyć 😉
Pozdrawiam!

Różnica pomiędzy alpha a visibility dla widoków (np przycisków) w Androidzie

Widzieliście kiedyś w sklepie Play aplikację typu: odblokowywanie odciskiem palca? Z tym, że przykładaliśmy palec do ekranu? Nie trudno domyślić się sztuczki, jaka jest tam zastosowana, czyli gdzieś jest niewidoczny przycisk, po kliknięciu którego aplikacja zadziała, bądź nie. Jednakże chcąc to samemu zaimplementować można stracić trochę czasu, próbując ustawić wartość .setVisibility() na odpowiednim widoku. Do tego typu zastosowań przydaje się metoda .setAlpha() przyjmująca wartości od 0 do 255, gdzie zero oznacza całkowitą przezroczystość. No dobrze, to w takim razie do czego .setVisibility()? Przyjmuje ona 3 parametry:

View.VISIBLE;
View.INVISIBLE;
View.GONE;
Działanie pierwszego jest oczywiste, przycisk ma pozostać normalnie widoczny. Czym się różnią drugi i trzeci? W przypadku w którym zostanie wybrana niewidzialność, nasz obiekt zniknie, ale zajmowane przez niego miejsce pozostanie puste, tak jak by dalej tam był, tylko po prostu niewidzialny. Z kolei, jeśli wybierzemy View.GONE, obiekt zniknie całkowicie. Stworzyłem małe demo obrazującego jak to działa:
Jak widać, wszystkie opcje są włączone, z kolei jeśli wybierzemy GONE dla dwóch pierwszych przycisków:
Dlaczego trzeci przycisk zmienił swoją postać? Fragment xml mam nadzieję wszystko wyjaśni:


android:id=”@+id/button3″
android:layout_below=”@+id/button2″
android:layout_alignParentLeft=”true”
android:layout_alignParentStart=”true”
android:layout_alignRight=”@+id/button2″
android:layout_alignEnd=”@+id/button2″ />
Miał odnosić się do prawej strony przycisku numer dwa, a skoro nie ma przycisku numer dwa, to został mu tylko wrap_content
Metoda .setEnabled() jest raczej oczywista, po prostu włącz bądź wyłącz. Ciekawie robi się w sytuacji, w której połączymy ją z metodą .setAlpha(), ponieważ taka kombinacja, przy opcji visibility jako visible, powoli nam osiągnąć to, o czym pisałem we wstępie, czyli powstanie nasz ukryty przycisk. Jednakże już visibilty jako invisible, zaburzy tą konstrukcję.
Mam nadzieję, że zmieszczone tutaj informację trochę rozjaśnią problemy z dziwnym zachowaniem przycisków w niektórych sytuacjach. Stworzyłem aplikację z którą można trochę poeksperymentować i zobaczyć jak zachowają się przyciski w różnych sytuacjach. Link do repozytorium.
Pozdrawiam!

Snackbar vs Toast

Wraz z Androidem 5.0 pojawił się Material Design, a razem z nim API do krótkiego wyświetlania powiadomień o nazwie Snackbar. Można na nim łatwo zaimplementować przycisk, co w przypadku Toast nie było już takie proste. Jednak mimo to Toast nie otrzymało statusu @Deprecated, czyli można stosować obydwa elementy, najlepiej w zależności od kontekstu w którym chcemy użyć krótkiego powiadomienia. Po za kontekstem, ważny może być również design i ogólny ux podczas korzystania z aplikacji. Nie spotkałem się z dokładnym przedstawienie kiedy używać którego, podpowiedzią może być to, że Snackbara wystarczy przesunąć aby zniknął, z kolei Toast miał ograniczony czas widoczności i po prostu musi swoje na ekranie wisieć.

Najprostsza implementacja wygląda w ten sposób.

Snackbar:
Snackbar.make(rl, „Snackbar”, Snackbar.LENGTH_LONG).show();

gdzie rl to RelativeLayout na którym ma być wyświetlony Snackbar.

Toast:
Toast.makeText(getApplicationContext(), „Toast”, Toast.LENGTH_LONG).show();

Jak widać, różnic zbyt wielu nie ma, Snackbar odnosi się do layoutu, z kolei Toast do contentu.
Kod który tutaj wkleiłem to implementacja Snackbara z biblioteki AndroidDesignSupportLibrary, o której już wspominałem. Tak wygląda to w najprostszej postaci:

Projekt na githubie.

Pozdrawiam!

Kurs programowania java na Kenis.pl

PSsssst – poniższe informacje są już dość mocno nieaktualne, po najświeższe kursy i wszystkie poprzednie, (płatne i darmowe) zapraszam tutaj: https://kursyandroid.pl/


Każdy kiedyś zaczynał. Dlatego chciałbym podzielić się przygotowanym przeze mnie we współpracy z kenis.pl kursem programowania. Kurs jest o javie, od instalacji środowiska, przez obiektowość, kończąc na nowościach w javie 8. Kurs jest dostępny za darmo, całkowicie i absolutnie, co zresztą jest ideą Kenis, żeby wiedza była była dostępna dla każdego. Nie przedłużam i podaję link do kursu:
Kurs programowania java na Kenis.pl

Podaję jeszcze link do githuba z zadaniami:
github KenisKursJava

Zapraszam serdecznie!

Pozdrawiam!

Animacja zmiany activity

Zauważyliście, że różni producenci stosują czasem różne animacje nowego activity w aplikacjach? Dzisiaj pokażę, jak ujednolicić animację, zwłaszcza wtedy kiedy tworzymy jakiś kreator, jest ona całkiem intuicyjna, zresztą, sami zobaczcie:

Dzisiejszy wpis będzie opowiadał o utworzeniu tej animacji od zera w nowym projekcie, tak aby początkujący poradzili sobie bez problemu, z kolei pro users, znajdą to, czego potrzebują.
Zaczynamy od utworzenia nowego projektu w AndroidStudio, ja pierwszą aktywność nazwałem FirstActivity.

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
    }

}

Po utworzeniu projektu, tworzymy następne Activity klikając File/New/Activity/Blank Activity. Nazwałem je SecondActivity. Kod jest analogiczny jak powyżej, oczywiście inna nazwa klasy i inny parametr metody setContentView. 

Teraz przechodzimy do layoutu i dodajemy, można przez przeciąganie, button. Layout dla pierwszego Activity wygląda tak:

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
    xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent”
    android:layout_height=”match_parent” android:paddingLeft=”@dimen/activity_horizontal_margin”
    android:paddingRight=”@dimen/activity_horizontal_margin”
    android:paddingTop=”@dimen/activity_vertical_margin”
    android:paddingBottom=”@dimen/activity_vertical_margin” tools:context=”.FirstActivity”>

    <TextView android:text=”@string/hello_world” android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:id=”@+id/textView2″ />

    <Button
        android:layout_width=”wrap_content”
        android:layout_height=”wrap_content”
        android:text=”@string/next”
        android:id=”@+id/nextBtn”
        android:onClick=”nextClick”
        android:layout_below=”@+id/textView2″
        android:layout_alignParentLeft=”true”
        android:layout_alignParentStart=”true” />

</RelativeLayout>

Layout dla drugiego Activity, jest oczywiście analogiczny, tylko tutaj zamiast next, mamy prev. Czyli pod wywołaniami onClick znajdują się metody nextClick i prevClick. Oto jak je zaimplementować:

public void nextClick(View view) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
        overridePendingTransition(0, 0);
    }

Metoda overridePendingTransition, to właśnie ta metoda, która odpowiada za animacje pomiędzy Activity. Dokumentacja znajduje się tutaj:
overridePendingTransition doc
Jak widzimy, pod parametrami enter anim oraz exit anim mamy w tym momencie zero i zero. Oznacza to tyle, że nie będzie żadnej animacji przejścia, czyli taki oto efekt:

Ok, a teraz dodamy animacje przejścia ekranu.
Klikamy na folder res, wybieramy new i android resource directory. Nazwiemy sobie nasz katalog anim. Następnie, tworzymy w tym katalogu 4 pliki:

left_in.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”0″
        android:toXDelta=”100%p”
        android:duration=”300″/>
</set>  

left_out.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”0″
        android:toXDelta=”-100%p”
        android:duration=”300″/>
</set> 

right_in.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”100%p”
        android:toXDelta=”0″
        android:duration=”300″/>
</set>  

right_out.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<set xmlns:android=”http://schemas.android.com/apk/res/android”
     android:interpolator=”@android:anim/linear_interpolator”>
    <translate
        android:fromXDelta=”-100%p”
        android:toXDelta=”0″
        android:duration=”300″/>
</set> 

Teraz tak, w metodzie nextClick zamieniamy parametry na:
overridePendingTransition(R.anim.right_in, R.anim.left_out);
Z kolei w metodzie prevClick:
overridePendingTransition(R.anim.right_out, R.anim.left_in);

I już, gotowe 😉 Animacja działa, możemy ją zwolnić lub przyspieszyć parametrem duration, u mnie trwa 300ms. Albo zmienić sposób rozchodzenia się obrazów metodami fromX oraz toX.
Podaję jeszcze link na githuba z tą właśnie animacją:
github migellal

Pozdrawiam!