Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Platformspecifikus Xamarin alkalmazások. Giachetta Roberto

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Platformspecifikus Xamarin alkalmazások. Platformspecifikus Xamarin alkalmazások

Eseményvezérelt alkalmazások fejlesztése II 11. előadás. Window Runtime specifikus alkalmazások megvalósítása. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II 8. előadás. Összetett WPF alkalmazások. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Cserép Máté

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek. Windows Runtime alapismeretek A Windows Runtime

2. Beadandó feladat dokumentáció

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése. Giachetta Roberto

3. Beadandó feladat dokumentáció

1. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

3. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek, Modern UI alapú alkalmazások.

Programozási technológia

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Xamarin alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Swing GUI készítése NetBeans IDE segítségével

2. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Xamarin alapismeretek. Xamarin alapismeretek. Xamarin alapismeretek. Xamarin alapismeretek

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

Globalizáció, Lokalizáció

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Dropbox - online fájltárolás és megosztás

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 10. előadás. Szolgáltatás alapú rendszerek megvalósítása (ASP.NET WebAPI) Cserép Máté

Thermo1 Graph. Felhasználói segédlet

1. ábra Fájl feltöltése 2. ábra Megtekintés

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Haladóprogramozás (C#) , I. félév BMF NIK

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

2. Beadandó feladat dokumentáció

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

ANDROID ALKALMAZÁSFEJLESZTÉS

BME MOGI Gépészeti informatika 13.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

A Java EE 5 plattform

Johanyák Zsolt Csaba: Grafikus felület programozása. Copyright 2008 Johanyák Zsolt Csaba

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

Alap számológép alkalmazás

A szerzõrõl... xi Bevezetés... xiii

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

ELTE SAP Excellence Center Oktatóanyag 1

Az ErdaGIS térinformatikai keretrendszer

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Johanyák Zsolt Csaba: Képnézegető program oktatási segédlet

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET) Webfejlesztés MVC architektúrában Fejlesztés ASP.

Input Output Műveletek

Overview. Service. Application Activity Activity 2 Activity 3. Fragment. Fragment. Fragment. Frag ment. Fragment. Broadcast Receiver

BME MOGI Gépészeti informatika 7.

Access adatbázis elérése OLE DB-n keresztül

Programozási technológia

3. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció

Mobil Partner telepítési és használati útmutató

OOP és UML Áttekintés

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

Mobil Informatikai Rendszerek

Az SQL*Plus használata

Mobil Informatikai Rendszerek

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Java Programozás 11. Ea: MVC modell

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

JNDI - alapok. Java Naming and Directory Interface

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Választó lekérdezés létrehozása

XML Webszolgáltatás alapú osztott alkalmazás fejlesztése Johanyák Zsolt Csaba 1

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

MVC. Model View Controller

OOP #14 (referencia-elv)

Függőség injekció Konstantinusz Kft 2010

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Állapotfenntartás. Állapotfenntartás. Állapotfenntartás.

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Mobil Telefonon Keresztüli Felügyelet Felhasználói Kézikönyv

Komponens alapú szoftverfejlesztés 8. előadás. Szoftver architektúrák alapvetései. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Objektumelvű programozás

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Webes alkalmazások fejlesztése 9. előadás. Webszolgáltatások felhasználása (ASP.NET WebAPI)

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

Nyíregyházi Egyetem Matematika és Informatika Intézete. Fájl rendszer

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése II 11. előadás Platformspecifikus Xamarin alkalmazások Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Alkalmazások környezete Az alkalmazások egy biztonságos környezetben futnak nem férhetnek hozzá más alkalmazások adataihoz csak korlátozott módon férhetnek hozzá a rendszer adataihoz (pl. fájlrendszer), és azt is csak engedéllyel szintén engedéllyel használhatják csak az eszközöket (application manifest) Mindegyik alkalmazás számára rendelkezésre áll egy beállítás/tulajdonság tároló, amelyben kulcs/érték párokat helyezhet el (a kulcs szöveg, ) egy lokális könyvtár, amely csak az alkalmazás fájljait tárolja Alkalmazás törlésekor a hozzá tartozó adatok is törlődnek ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:2

Alkalmazások életciklusa A mobil alkalmazások más életciklusban futnak, mint az asztali alkalmazások a futás alatt (running) és a terminált (not running) állapotok mellett megjelenik a felfüggesztett (suspended) állapot is, amely akkor lép életbe, ha az alkalmazás a háttérbe (vagy a gép alvó állapotba) kerül, célja a takarékosság aktiválás leállítva futás alatt folytatás felfüggesztés felfüggesztve leállítás ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:3

Alkalmazások életciklusa A felfüggesztés célja az erőforrásokkal való takarékoskodás a fejlesztőnek törekednie kell rá, hogy felfüggesztett állapotban az alkalmazás minél kevesebb erőforrást igényeljen a futó tevékenységeket célszerű leállítani, az adatokat perzisztálni A rendszer úgy is dönthet (pl. ha kevés a memória), hogy a felfüggesztett alkalmazást leállítja, majd újraindítja, ha a felhasználó visszaváltott rá célszerű, hogy a felhasználó ennek ellenére olyan állapotban kapja vissza az alkalmazást, amelyben hagyta, így ezt az állapotot vissza kell állítanunk az állapot eltárolását felfüggesztéskor kell elvégeznünk ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:4

Alkalmazások életciklusa A Xamarin Forms alkalmazások egységes életciklus kezeléssel rendelkeznek az alkalmazás (App) tartalmaz metódusokat indításkor (OnStart), felfüggesztéskor (OnSleep) és folytatáskor (OnResume) futtatandó tevékenységek végrehajtására emellett az egyes platformokon külön is kezelhetjük az életciklust a perzisztálás történhet az alkalmazás beállításai/tulajdonságai közé, amelyet a rendszer automatikusan tárol (Application.Properties) a fájlrendszerbe, vagy adatbázisba (pl. SQLite) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:5

Alkalmazások életciklusa Pl.: public class App : Application { protected override void OnSleep() { // felfüggesztés Properties["state"] = _data; // állapot elmentése a tulajdonság közé _data = null; // memória kiürítése } protected override void OnSleep() { // folytatás if (Properties.ContainsKey("state")) _data = Properties["state"]; // ha van elmentett állapot, visszatöltjük } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:6

Példa Feladat: Készítsünk egy vizsgatétel generáló alkalmazást, amely ügyel arra, hogy a vizsgázók közül ketten ne kapják ugyanazt a tételt. kiegészítjük életciklus kezeléssel az alkalmazást, eltároljuk a modell állapotát, valamint a generálás állapotát az alkalmazás beállításai (Properties) közé mivel nincs külön perzisztencia, közvetlenül a modelltől kérjük el az információkat, és tároljuk el egyenként indításkor, illetve folytatáskor a korábbi állapotot betöltjük, és ennek megfelelően inicializáljuk a modellt a hatékony erőforrás gazdálkodás érdekében felfüggesztéskor felszabadítjuk a modellt és nézetmodellt is ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:7

Példa Tervezés: App Application - _model :IExamGeneratorModel - _viewmodel :ExamGeneratorViewModel + App() # OnStart() :void # OnSleep() :void # OnResume() :void -_viewmodel TabbedPage View::MainPage + MainPage() ViewModelBase ViewModel::ExamGeneratorViewModel -_model «interface» Model::IExamGeneratorModel -_model Model::ExamGeneratorModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:8

Példa Megvalósítás (App.cs): protected override void OnSleep() { Properties["questionCount"] = _model.questioncount; // elmentjük a tételek számát Properties["periodCount"] = _model.periodcount; } _model = null; _viewmodel = null; MainPage.BindingContext = null; // a szemétgyűjtő kitörli a memóriából a // modellt és a nézetmodellt ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:9

Példa Megvalósítás (App.cs): protected override void OnResume() { // ha el lett mentve az állapot, akkor // visszatöltjük if (Properties.ContainsKey("questionCount")) { _model = new ExamGeneratorModel( (Int32)Properties["questionCount"], (Int32)Properties["periodCount"]); // az elmentett adatokkal példányosítjuk a // modellt } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:10

Perzisztencia A Xamarin Forms nem biztosít egységes megoldást a perzisztenciára, mivel a megvalósítás platformonként jelentősen eltérhet a perzisztencia platformonként történő megvalósítását a függőség befecskendezés teszi lehetővé a hasonló platformfüggő függőségek kezelésének megkönnyítésére egy egységes módszer biztosított (DependencyService) a függőségek megvalósítását megjelölhetjük (Dependency attribútum), így a rendszer automatikusan regisztrálja és betölti őket a függőségeket az interfészen keresztül betölthetjük (DependencyService.Get) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:11

Perzisztencia pl.: // Android platformkód [assembly: Dependency(typeof(DroidPersistence))] // megjelöljük a függőséget namespace App.Droid { public DroidPersistence : IPersistence { public void SaveData(String data) { // perzisztencia megvalósítása } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:12

Perzisztencia pl.: // Xamarin Forms kód public interface IPersistence { } // perzisztencia interfésze IPersistence persistence = DependencyService.Get<IPersistence>(); // megtalálja a perzisztencia megvalósítását // az adott platformon IModel model = new Model(persistence); // így most már befecskendezhető ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:13

Perzisztencia Android plarformon Az Android (és ios) platform(ok) a fájlkezelés összes lehetővégét biztosítják könyvtárak (Directory) elérését, listázását (GetFiles, GetDirectories), benne könyvtárak létrehozását (CreateDirectory), fájlok és könyvtárak törlését (Delete) fájlok (File) létrehozását, megnyitását (Open), olvasást (ReadAllBytes, ReadAllLines, ReadAllText), írást (WriteAllBytes, ), másolást (Copy), az írás és olvasás történhet adatfolyamok segítségével is (StreamReader, StreamWriter), amelyeket a megszokott módon használhatunk ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:14

Perzisztencia Android plarformon Android platformon a perzisztálás történhet: az alkalmazás helyi könyvtárába (Environment.SpecialFolder.ApplicationData) a felhasználó személyes könyvtárába (SpecialFolder.Personal), vagy tematikus könyvtárba (SpecialFolder.MyMusic, SpecialFolder.MyPictures) az összes felhasználó által elérhető alkalmazás könyvtárba (SpecialFolder.LocalApplicationData) Az utak kezelését a Path osztály, speciális könyvtárak elér elérési ését az Environment.GetFolderPath metódus biztosítja ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:15

Perzisztencia Android plarformon pl.: String documentspath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // felhasználó könyvtárának lekérése String filepath = Path.Combine(documentsPath, filename); // fájl elérési útvonalának létrehozása File.WriteAllText(filePath, text); // szöveg kiírása a fájlba ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:16

Perzisztencia Windows platformon Windows platformon az alkalmazás fájljait a megadott könyvtáron keresztül (StorageFolder) kezelhetjük listázhatunk (GetFilesAsync) létrehozhatunk (CreateFileAsync), betölthetünk (OpenAsync), törölhetünk (DeleteAsync) fájlokat, illetve könyvtárakat a könyvtárakban fájlok (StorageFile) helyezkednek el, amelyeknek elérhetjük a tulajdonságait (Name, FileType, Properties, ) a fájlokat a FileIO osztályon keresztül írhatjuk/olvashatjuk szöveges, illetve bináris tartalmat tudunk kezelni (ReadTextAsync(), ReadLinesAsync(), ReadBufferAsync( ), WriteTextAsync( )) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:17

Perzisztencia Windows platformon a megszokott adatfolyam kezelés is elérhető (StreamReader, StreamWriter), azonban funkcionalitása korlátozott Windows platform a perzisztálás történhet lokálisan, a helyi fájlrendszerben (ApplicationData.Current.LocalFolder) központilag (roaming), a felhasználói fiókhoz társítva (ApplicationData.Current.RoamingFolder), amelyek a felhasználó valamennyi eszközén elérhetőek átmenetileg, futás közben elérhető tárhelyen (ApplicationData.Current.TemporaryFolder) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:18

Perzisztencia Windows platformon pl.: StorageFolder folder = ApplicationData.Current.LocalFolder; // alkalmazás helyi könyvtárának lekérdezése StorageFile file = await Folder.GetFileAsync("data.txt"); // fájl (aszinkron) betöltése IList<String> lines = await FileIO.ReadLinesAsync(file); // összes sor kiolvasása a fájlból ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:19

Példa Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. elkésztjük a nézet Xamarin Forms megvalósítását, amelyben képekkel (Image) jelenítjük meg a mező tartalmát egy rácsban (FlowListView), a képeket csatoljuk a platformprojektekhez (circle.png, cross.png, empty.png) megvalósítjuk a perzisztenciát Android (AndroidFilePersistence) és Windows (WindowsFilePersistence) platformokra, amelyeket függőségként kezelünk a mentést a főprogram hajtja végre egy közös fájlba (így mindig csak az utolsó állapotot tudjuk menteni), valamint felfüggesztés esetén is mentjük az aktuális játékállapotot ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:20

Példa Tervezés: ContentPage View::MainPage ContentView View::AutoSizeContentView App - _persistence :IPersistence - _model :TicTacToeModel - _viewmodel :TicTacToeViewModel Application -_viewmodel ViewModelBase ViewModel::TicTacToeViewModel + App() # OnStart() :void # OnSleep() :void # OnResume() :void - Model_GameWon(object, GameWonEventArgs) :void - Model_GameOver(object, EventArgs) :void - ViewModel_LoadGame(object, System.EventArgs) :void - ViewModel_SaveGame(object, System.EventArgs) :void -_model Model::TicTacToeModel -_persistence «interface» Persistence::IPersistence + LoadAsync(String) :Task<Player[]> + SaveAsync(String, Player[]) :Task -_persistence Persistence::WindowsFilePersistence Persistence::AndroidFilePersistence ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:21

Példa Megvalósítás (App.cs): protected override void OnSleep() { // elmentjük a jelenleg folyó játékot try { Task.Run(() => await _model.savegameasync("suspendedgame")); // az aszinkron tevékenységet taszkban // futtatjuk } catch { } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:22

Példa Megvalósítás (AndroidFilePersistence.cs): public async Task<Player[]> LoadAsync(String path) { // a betöltés a személyes könyvtárból történik String filepath = Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.Personal), path); } // a fájlműveletet taszk segítségével végezzük String text = await Task.Run(() => File.ReadAllText(filePath)); return text.split().select(number => (Player)Int32.Parse(number)).ToArray(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:23

Példa Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. lehetőséget adunk a felhasználónak a betöltött/mentett fájl kiválasztására két új oldal segítségével (LoadGamePage, SaveGamePage), amt navigáció (NavigationPage) segítségével kapcsolunk a főoldalhoz a nézetek mellett meg kell valósítanunk a fájlböngészés perziszenciáját (IStore), amely beolvassa a könyvtárak tartalmát (platformonként eltérő módon) modelljét (StoredGameBrowserModel), amely kezeli a játékok adatait nézetmodelljét (StoredGameBrowserViewModel), amely biztosítja a frissítést és a parancsok végrehajtását ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:24

Példa Tervezés: ViewModelBase ViewModel::StoredGameBrowserViewModel - _model :StoredGameBrowserModel App - _persistence :IPersistence - _tictactoemodel :TicTacToeModel - _tictactoeviewmodel :TicTacToeViewModel - _gamepage :GamePage - _store :IStore - _storedgamebrowsermodel :StoredGameBrowserModel - _storedgamebrowserviewmodel :StoredGameBrowserViewModel - _loadgamepage :LoadGamePage - _savegamepage :SaveGamePage - _mainpage :NavigationPage EventArgs ViewModel:: StoredGameEventArgs «property» + Name() :String Application + App() # OnStart() :void # OnSleep() :void # OnResume() :void - Model_GameWon(object, GameWonEventArgs) :void - Model_GameOver(object, EventArgs) :void - TicTacToeViewModel_LoadGame(object, System.EventArgs) :void - TicTacToeViewModel_SaveGame(object, System.EventArgs) :void - StoredGameBrowserViewModel_GameLoading(object, StoredGameEventArgs) :void - StoredGameBrowserViewModel_GameSaving(object, StoredGameEventArgs) :void -_storedgamebrowserviewmodel -_storedgamebrowsermodel + StoredGameBrowserViewModel(StoredGameBrowserModel) - UpdateStoredGames() :void - Model_StoreChanged(object, EventArgs) :void - OnGameLoading(String) :void - OnGameSaving(String) :void «event» + GameLoading() :EventHandler<StoredGameEventArgs> + GameSaving() :EventHandler<StoredGameEventArgs> «property» + NewSaveCommand() :DelegateCommand + StoredGames() :ObservableCollection<StoredGameViewModel> -_model ViewModelBase ViewModel::StoredGameViewModel - _name :String - _modified :DateTime «property» + Name() :String + Modified() :DateTime + LoadGameCommand() :DelegateCommand + SaveGameCommand() :DelegateCommand -_store «interface» Persistence::IStore + GetFiles() :Task<IEnumerable<String>> + GetModifiedTime(String) :Task<DateTime> -_store Model::StoredGameBrowserModel - _store :IStore + StoredGameBrowserModel(IStore) + UpdateAsync() :Task - OnSavesChanged() :void «event» + StoreChanged() :EventHandler «property» + StoredGames() :List<StoredGameModel> Model::StoredGameModel «property» + Name() :String + Modified() :DateTime ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:25

Viselkedések Lehetőségünk van a grafikus felület működését deklaratív módon bővíteni viselkedések (Behavior) segítségével a viselkedés egy olyan típus, amely adott vezérlőhöz biztosít hozzáférést, és adott típusú vezérlőhöz csatlakoztatható, további tevékenységeket pl. tulajdonságok megváltoztatása, állapot ellenőrzése megadhatunk vezérlő csatlakoztatásakor (OnAttachedTo) és lecsatlakoztatásakor (OnDetachingFrom) végrehajtható tevékenységet általában egy eseménykezelőt társítunk, amely egészen a lecsatlakoztatásig végrehajtódik a metódusokban mindig meg kell hívnunk az ős metódusát ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:26

Viselkedések pl.: public class NumericValidationBehavior : Behavior<Entry> // egy viselkedés beviteli mezőkre { protected override void OnAttachedTo( Entry entry) { entry.textchanged += OnEntryTextChanged; // eseménykezelő hozzárendelése szöveg // megváltoztatásakor base.onattachedto(entry); } // az eseménykezelő validálja a tartalmat ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:27

Viselkedések a viselkedések XAML kódban hasznosíthatóak a vezérlőkre példányosítva (Behaviors) így amennyiben a megfelelő viselkedés rendelkezésre áll, tetszőleges módon bővíthető deklaratívan a működés pl.: <Entry Placeholder="Enter number"> <Entry.Behaviors> <local:numericvalidationbehavior /> <!-- az ellenőrzés automatikusan lefut a szöveg megváltoztatásakor --> </Entry.Behaviors> </Entry> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:28

Példa Feladat: Készítsünk egy egyszerű számológépet, amellyel a négy alapműveletet végezhetjük el, illetve láthatjuk korábbi műveleteinket is. valósítsuk meg a tájoláskezelést viselkedések segítségével a tájolás platformonként eltérő módon kérhető le, ezért egy interfészen keresztül (IDeviceProperties) férünk hozzá a platformfüggő megvalósításhoz, mint függőséghez (DependencyService) két viselkedést veszünk fel egyik tetszőleges vezérlő elhelyezését befolyásolja (ViewOrientationBehavior) a másik a StackLayout elem elrendezési módját befolyásolja (StackLayoutOrientationBehavior) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:29

Példa Tervezés: ContentPage View::MainPage «enumeration» Device:: DeviceOrientation Landscape Portrait «interface» Device::IDeviceProperties «property» + DeviceOrientation() :DeviceOrientation Behavior View::ViewOrientationBehavior - _properties :IDeviceProperties + ViewOrientationBehavior() # OnAttachedTo(Xamarin.Forms.View) :void # OnDetachingFrom(Xamarin.Forms.View) :void - Bindable_SizeChanged(object, EventArgs) :void Behavior View::StackLayoutOrientationBehavior - _properties :IDeviceProperties Device::AndroidDeviceProperties «property» + DeviceOrientation() :DeviceOrientation Device::WindowsDeviceProperties «property» + DeviceOrientation() :DeviceOrientation + StackLayoutOrientationBehavior() # OnAttachedTo(StackLayout) :void # OnDetachingFrom(StackLayout) :void - Bindable_SizeChanged(object, EventArgs) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:30

Példa Megvalósítás (StackLayoutOrientationBehavior.cs): private void Bindable_SizeChanged(object sender, EventArgs e) { // az eszköz tájolásának függvényében // változtatunk a StackLayout tájolásán switch (_properties.deviceorientation){ case DeviceOrientation.Landscape: if (stacklayout.orientation!= StackOrientation.Horizonal) stacklayout.orientation = StackOrientation.Horizontal; break; ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:31

Lokalizáció Általános elvárás, hogy az alkalmazások a felhasználó nyelvén kommunikáljanak, és annak megfelelő nyelvi környezetet használják (pl. számformátum, pénznem, ), ezt nevezzük az alkalmazás lokalizációjának (application localization) A.NET alkalmazások a lokalizációt egységes formában kezelik (a System.Globalization névtérben) az alkalmazás nyelvi környezete (CultureInfo) bárhol elérhető, módosítható, illetve az alkalmazás átveheti a rendszer nyelvi környezetét (CultureInfo.CurrentCulture) a megjelenített, nyelvfüggő tartalmakat (szöveg, képek) lehetőségünk van lokalizált erőforrásokból (resource file) betölteni ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:32

Lokalizáció A lokalizációt két lépésben határozhatjuk meg, nyelv, illetve terület (ország szintjén) pl.: angol (Egyesült Államok): en-us, angol (Egyesült Királyság): en-gb, magyar (Magyaország): hu-hu az adott lokalizációhoz kérhetjük le az erőforrásokat (CultureInfo), pl.: CultureInfo info = new CultureInfo("en-US"); // amerikai lokalizáció betöltése így lehetőségünk van elérni a lokális információkat, pl.: naptár (Calendar), időformátum (DateTimeFormat), számformátum (NumberFormat), tizedes elválasztó (NumberFormat.NumberDecimalSeparator) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:33

Lokalizált erőforrások Az alkalmazás erőforrásait elhelyezhetjük erőforrás fájlokban (.resx), majd közvetlenül, statikus tulajdonságokként hivatkozhatjuk meg őket az erőforrás fájl neve az osztálynév, a kulcs a tulajdonság neve lesz, pl.: namelabel.text = AppText.NameText; // az AppText.resx fájl NameText kulcsú // szövegének betöltése, és a címkére állítása az erőforrásfájlt több nyelvre is elkészíthetjük úgy, hogy a lokalizáció nevét hozzáillesztjük a fájlnévhez, pl.: AppText.en-US.resx // szövegek amerikai nyelvi környezetre AppText.hu-HU.resx // magyar környezetre ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:34

Lokalizált erőforrások a rendszer a beállított nyelvi környezetnek megfelelő erőforrásfájl tartalmát tölti be amennyiben a lokalizációnak megfelelő fájl nem található, vagy nincs benne megadott kulcsú elem, akkor a lokalizáció nélkül megadott erőforrásfájl tartalmát tölti be így célszerű minden esetben egy alapértelmezett erőforrás fájlt is készíteni, pl.: AppText.resx // alapértelmezett szövegek AppText.hu-HU.resx // lokalizáció magyar környezetre az erőforrások kezelése további lehetőségeket a ResourceManager típus biztosít ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:35

Lokalizált erőforrások a nézetben Amennyiben a lokalizációt nem kódban, hanem a grafikus felületen (XAML-ben) szeretnénk betölteni, ki kell bővítenünk a Xamarin funkciónalitását a felületre történő beíráshoz szükséges egy bővítés a leíró nyelvhez (IMarkupExtension), amelyben megadjuk a lokalizált tartalom betöltésének módját (ProvideValue) Android és ios platformokon ezen felül a beépített nyelvi környezetet meg kell feleltetnünk.net nyelvi környezetnek, így azt platformfüggő módon kell lekérnünk pl. ki kell cserélnünk az összekötőt (_ helyett -), egyes környezetek helyett mást kell használnunk (gsw-ch helyett de-ch) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:36

Példa Feladat: Készítsünk egy egyszerű számológépet, amellyel a négy alapműveletet végezhetjük el, illetve láthatjuk korábbi műveleteinket is. jelenítsük meg a szövegeket és a tizedes elválasztót a nyelvi beállításnak megfelelően angolul, vagy magyarul a tizedes elválasztót a nézetmodell közvetlenül elkérheti a környezettől a szövegeket erőforrásban (ApplicationText) tároljuk, amelyből készítünk alapértelmezett és magyar változatot kiegészítjük az eszköztulajdonságokat (IDeviceProperties) a nyelvi környezet kezelésével Android platformra megvalósítunk egy XAML bővítést, ami szintén elvégzi a konverziót (TranslateExtension) ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:37

Példa Tervezés: ContentPage View::MainPage IMarkupExtension View::TranslateExtension - _cultureinfo :CultureInfo {readonly} + TranslateExtension() + ProvideValue(IServiceProvider) :Object «property» + Text() :String «interface» Device::IDeviceProperties + GetCurrentCultureInfo() :CultureInfo + SetLocale(CultureInfo) :void «property» + DeviceOrientation() :DeviceOrientation ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:38

Példa Megvalósítás (MainPage.xaml): <ContentPage xmlns:view="clr-namespace:elte.calculator.view" > <Label Text="{view:Translate HistoryListTitle}" Style="{StaticResource NumberListViewLabelStyle}" /> <!-- nyelvfüggő szöveg betöltése a TranslateExtension típus segítségével --> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 11:39