Xamarin i F# - Wprowadzenie

Dziesiejszym rynkiem rządzą aplikacje mobilne. Zazwyczaj tanie (względnie), ale przy dużej ilości użytkowników twórcy zarabiają miliony. Dlatego warto umieć tworzyć aplikacje mobilne. A najlepiej tworzyć je na platformie, którą się zna i lubi - .NET

Kiedy pierwszy raz chciałem zrobić aplikację na Androida, jakieś 3 lata temu, sięgnąłem po Cordovę, bo znałem podstawy HTML, i średnio mi to wyszło. Jednak teraz mając do dyspozycji Xamarin, wszystko wygląda inaczej.

Na początek

Zanim zaczniemy cokolwiek robić musimy zainstalować sobie niezbędne narzędzia. Potrzebne nam będzie Visual Studio (lub Xamarin Studio) oraz Xamarin. Jeśli za pierwszym razem projekty nie będą się kompilować, to pewnie znak, że trzeba coś doinstalować (albo ofiarować kozę bogom Visuala).

Instalacja VS i Xamarina, trwała w moim przypadku około 5 godzin i zajęła około 30GB. Przy czym polecam zainstalować VS 2015. Instaluje się jeszcze wolniej, ale w przeciwieństwie do VS 2017 RC, macie większą gwarancję działania.

Nowy projekt

Jeśli zainstalowaliście wszystko co trzeba, to powinnieście zobaczyć template’y Android i iOS podczas tworzenia nowego projektu. Ponieważ nie mam iPhone’a, ani Maca, skupimy się na Androidzie. Więc wybieramy zakładkę Visual F# > Android > Blank App i tworzymy nowy pusty projekt.

A tu niespodzianka, pusty projekt zawiera przycisk z napisem “Hello World”, a jak się w niego kilknie to liczy kliknięcia. Bardzo fajne podejście, które pozwoliło mi szbciej zacząć pracę z nieznanym dotąd środowiskiem.

Co widzimy

Zacznijmy od tego co my w tym pustym projekcie widzimy. Mamy MainActivity.fs, folder Assests, folder Resources i folder Properties.

[<Activity (Label = "MyApplication", MainLauncher = true, Icon = "@drawable/Icon")>]
type MainActivity () =
	inherit Activity ()

W pliku MainActivity.fs znajdziemy klasę MainActivity. Jest to taki punkt wejścia naszej aplikacji i zawiera atrybut, który definuje nagłówek naszej aktywności (Label), to że jest ona główna (MainLauncher) i ikonę. W dodaktu MainActivity dziedziczy po klasie Activity, która zapewania nam większość funkcjonalności.

O aktywnościach w Androidzie można myśleć jak o stronach w UWP, lub jak o stronach internetowych. Tylko są one jakby nieco odłączone od widoków, co zaraz wyjaśnię. Teraz spójrzmy na przeładowaną metodę OnCreated

override this.OnCreate (bundle) =
    base.OnCreate (bundle)

    this.SetContentView (Resource_Layout.Main)
	//...

Metoda OnCreated, jak sama nazwa wskazuje, jest wywoływana po utworzeniu aktywności. Przyjmuje ona parametr bundle, którym na razie nie będziemy się zajmować. Zaczynamy od wywołania metody OnCreate na naszym rodzicu, a następnie wywołujemy SetContentView podając mu odpowiedni zasób. To jest powód dla którego powiedziałem, że aktywności są odłączone od widoków. Możemy mieć kilka aktywności wykorzystujących ten sam layout.

A jak taki layout wygląda?

<!--Main.axml-->
<?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="fill_parent">
	<Button
		android:text="@string/Hello"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:id="@+id/btnHello" />
</LinearLayout>

Jest to po prostu plik XML ze schematem xmlns:android i odpowiednimi atrybutami definiującymi kontrolki, które zostaną wyświetlone na ekranie. LinearLayout, to trochę odpowiednik StackPanel w UWP, kontener, który w określonej orientacji, pionowej lub poziomej, układa kontrolki (tu: przycisk).

Resources

W folderze zasobów znajduje się wszystko co nasza aplikacja potrzebuje do działania, niezwiązanego z kodem. W podfolderze layout mamy wspomniany wcześniej plik Main.axml. W podfolderze values mamy plik strings.xml, który zawiera dane do wyświetlania. Dlatego w powyższym layoutcie nasz przycisk ma atrybut text ustawiony na "@string/Hello". Oznacza to - weź string z pliku strings.xml o nazwie Hello i przypisz jego wartość do tego atrybutu.

Nie trzeba używać zasobów w sposób opisany powyżej, można na sztywno ustawić, ale pomoże to przy tworzeniu aplikacji multi językowej.

Dalej mamy podfolder drawable, który zawiera plik Icon.png, do którego odwołujemy się w atrybucie naszej MainActivity.

Assets

W folderze Assets mamy jeden plik - AboutAssets.txt, w którym napisane jest żeby umieścić w tym folderze dowolne pliki potrzebne w naszej aplikacji oraz że możemy się do nich odnieść w ten sposób:

let input = Assets.Open("my_asset.txt")

Więc jest to dość proste. Otrzymana wartość jest typu InputStream (bo w Javie mamy dwa rodzaje strumieni: input i output).

Properties

W folderze Properties mamy znany wszystkim .NETowcom plik AssemblyInfo.fs, który definiuje atrybutu naszej aplikacji/biblioteki. A do tego mamy plik AndroidManifest.xml, który możemy edytować z poziomu właściwości projektu. Manifest będzie zawierać informacje o aplikacji, nazwę, minimalną wersję systemu operacyjnego oraz uprawnienia jakie potrzebujemy (np. dostęp do kamery).

To by było tyle jeśli chodzi o wprowadzenie. Jednak nadal nie wiemy jak tworzyć aplikacje w Xamarinie. Dlatego wyczekujcie kolejnego posta o utworzeniu prostej aplikacji “ToDo”.