ListView Spinner Button TextView EditText Radiogroup GridView ViewPager Tabbladen...

Maat: px
Weergave met pagina beginnen:

Download "ListView Spinner Button TextView EditText Radiogroup GridView ViewPager Tabbladen..."

Transcriptie

1 Android UI componenten 1/41 UI componenten Inhoud ListView... 2 Spinner... 9 Button TextView EditText Radiogroup GridView ViewPager Tabbladen NavigationDrawer AlertDialog Imageview WebView OptionsMenu DatePickerDialog CalendarView Toast... 40

2 2/41 Android UI componenten UI componenten De gebruikersinterface (User Interface) in Android wordt opgebouwd met Views en Viewgroups. Een View is een specifiek onderdeel van het scherm zoals bvb. een lijst, een keuzelijst, een knop, een tekstvak, een label, een afbeelding, een grid, enz Een Viewgroup kan een aantal Views bevatten. Zo kan je bvb. in een LinearLayout een label, een tekstvak, een knop en lijst opnemen. De positie van de Views kan bepaald worden door de attributen van de Viewgroup. Zo kan het oriëntatie-attribuut van een LinearLayout aangeven dat de Views onder mekaar moeten verschijnen (android:orientation="vertical") of achter mekaar moeten verschijnen (android:orientation="horizontal"). ListView In dit voorbeeld wordt een ListView getoond op het startscherm van de app. In de source code wordt de "activity_main" layout niet gebruikt en wordt met de functie setlistadapter(mijnadapter) aangegeven dat de inhoud van de "adapter" op het scherm moet getoond worden. De activiteit is afgeleid van een ListActivity. De regels in de lijst gebruiken als standaard layout (per regel) de Android gedefinieerde layout "simple_list_item_1". De gegevens komen uit de String array "waarden". De "ArrayAdapter" zorgt dus voor de koppeling tussen de gegevens uit de array en de layout van de lijst. Als de gebruiker op een item van de lijst klikt met de muis in de emulator (AVD) of met de vinger een item aanduidt op een tablet of smartphone dan wordt de functie "onlistitemclick()" uitgevoerd. In het voorbeeld wordt dan voor het eerste item (Klanten) een nieuwe activiteit opgestart (met een "intent"). package com.android.listactiviteit;

3 Android UI componenten 3/41 import android.app.listactivity; import android.content.intent; import android.os.bundle; import android.view.view; import android.widget.arrayadapter; import android.widget.listview; import android.widget.toast; public class MainActivity extends ListActivity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); //setcontentview(r.layout.activity_main); String[] waarden = new String[] {"Klanten","Leveranciers","Bestellingen","Betalingen","Producten" ; ArrayAdapter<String> mijnadapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,waarden); setlistadapter(mijnadapter); protected void onlistitemclick(listview l, View v, int position, long id) { String item = (String) getlistadapter().getitem(position); //Toast.makeText(this, item + " geselecteerd", Toast.LENGTH_LONG).show(); if (position == 0) { // klanten Intent in1 = new Intent(this,Klanten.class); startactivity(in1); In de Klanten activiteit kunnen gegevens ingegeven worden en worden die gegevens toegevoegd aan een lijst. De lijst is hier een onderdeel van een gewone activiteit. package com.android.listactiviteit; import java.util.arraylist; import android.app.activity; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.button; import android.widget.edittext; import android.widget.listview; import android.widget.adapterview.onitemclicklistener; import android.widget.toast; public class Klanten extends Activity { private Button btn1; private ListView lvcontacten; private ArrayList<String> lvstrings = new ArrayList<String>(); private ArrayAdapter<String> lvadapter; private EditText etnaam; private EditText ettelefoon; private EditText et ; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.klanten); btn1 = (Button) findviewbyid(r.id.button1); btn1.setonclicklistener(btn1klik); etnaam = (EditText) findviewbyid(r.id.et_contacten_naam);

4 4/41 Android UI componenten ettelefoon = (EditText) findviewbyid(r.id.et_contacten_telefoon); et = (EditText) findviewbyid(r.id.et_contacten_ ); OnClickListener btn1klik = new OnClickListener() { public void onclick(view v) { // opvullen adapter en koppelen aan listview vulop(); ; public void vulop() { lvcontacten = (ListView) findviewbyid(r.id.lv_contacten); lvadapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, lvstrings); lvadapter.add(etnaam.gettext().tostring() + " " + ettelefoon.gettext().tostring() + " " + et .gettext().tostring()); lvcontacten.setadapter(lvadapter); lvcontacten.setonitemclicklistener(lvitemclick); etnaam.settext(""); ettelefoon.settext(""); et .settext(""); OnItemClickListener lvitemclick = new OnItemClickListener() { public void onitemclick(adapterview<?> parent, View view, int position, long id) { String item = (String) lvadapter.getitem(position); String naam = item.substring(0, item.indexof(" ")); Toast.makeText(getApplicationContext(), naam, Toast.LENGTH_SHORT).show(); ; En de layout van het Klanten scherm ziet er als volgt uit: <LinearLayout xmlns:android=" xmlns:tools=" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:orientation="horizontal" > <TextView android:id="@+id/tv_contacten_naam" android:layout_width="wrap_content" android:text="naam: " android:textstyle="bold" /> <EditText android:id="@+id/et_contacten_naam" > </EditText> </LinearLayout> <LinearLayout android:orientation="horizontal" > <TextView android:id="@+id/tv_contacten_telefoon" android:layout_width="wrap_content" android:text="telefoon: " android:textstyle="bold" />

5 Android UI componenten 5/41 <EditText > </EditText> </LinearLayout> <LinearLayout android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:text=" " android:textstyle="bold" /> <EditText android:layout_width="296dp" android:layout_weight="0.95" > </EditText> <Button android:layout_width="wrap_content" android:text="toevoegen" /> </LinearLayout> <LinearLayout android:orientation="vertical" > <ListView > </ListView> </LinearLayout> </LinearLayout> Als je meer dan 1 activiteit in jouw app gebruikt dan moet je dat ook aangeven in het Android manifest bestand. <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=" package="com.android.listactiviteit" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="15" android:targetsdkversion="17" /> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="com.android.listactiviteit.mainactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity>

6 6/41 Android UI componenten <activity android:name="com.android.listactiviteit.klanten" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> </manifest> De functie setlistadapter() van een ListActivity en de functie setadapter() van een Listview (lvcontacten.setadapter(lvadapter);) gebruiken een "adapter". Een adapter kan op verschillende manieren opgevuld worden. Enkele voorbeelden: 1) Een array van strings die vooraf gedefinieerd is. // declaraties private ListView lvlijst; private ArrayAdapter<String> lvadapter; public static final String[] scheesestrings = { "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi", "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue", "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue", "Xanadu", "Xynotyro", "Yarg Cornish", "Yarra Valley Pyramid", "Yorkshire Blue", "Zamorano", "Zanetti Grana Padano", "Zanetti Parmigiano Reggiano" ; // in de oncreate functie lvlijst = new ListView(this); // een vaste array van strings om de adapter op te vullen lvadapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, scheesestrings); lvlijst.setonitemclicklistener(lvitemclick); lvlijst.setadapter(lvadapter); setcontentview(lvlijst); 2) Een array van "Character Sequences" (strings) die gedefinieerd is in "strings.xml" (res/values).

7 Android UI componenten 7/41 // declaraties private ListView lvlijst; private ArrayAdapter<CharSequence> lvadapter; // in de oncreate functie lvlijst = new ListView(this); // een array van character sequences (strings) die gedefinieerd is in strings.xml (res/values) lvadapter = ArrayAdapter.createFromResource(this, R.array.leerlingen_list, android.r.layout.simple_list_item_1); lvlijst.setonitemclicklistener(lvitemclick); lvlijst.setadapter(lvadapter); setcontentview(lvlijst); De "R.array.leerlingen_list" inhoud wordt als volgt gedefinieerd. <string-array name="leerlingen_list"> <item>jan</item> <item>piet</item> <item>joris</item> <item>korneel</item> <item>anna</item> <item>linda</item> <item>paul</item> <item>peter</item> <item>cindy</item> </string-array> 3) Een lege arraylist van strings die opgevuld wordt met de methode "add()" van de adapter. // declaraties private ListView lvlijst; private ArrayAdapter<String> lvadapter; private ArrayList<String> lvstrings = new ArrayList<String>(); // in de oncreate functie lvlijst = new ListView(this); //lvstrings :een lege arraylist van strings die opgevuld wordt met de methode add van de adapter lvadapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, lvstrings); lvadapter.add("item 1"); lvadapter.add("item 2"); lvadapter.add("item 3"); lvlijst.setonitemclicklistener(lvitemclick); lvlijst.setadapter(lvadapter); setcontentview(lvlijst);

8 8/41 Android UI componenten 4) Items ophalen uit een database en in de "SimpleCursorAdapter" stoppen met de eigen gemaakte functie getitems(). // declaraties public static final int ADD_ITEM = 0; private static final int ENDAPP = 1; private DBAdapter mdbhelper; private int mitemnumber = 1; private ListView lvlijst; private SimpleCursorAdapter lvadapter; // in de oncreate functie lvlijst = new ListView(this); mdbhelper = new DBAdapter(this); mdbhelper.open(); lvadapter = getitems(); lvlijst.setonitemclicklistener(lvitemclick); lvlijst.setadapter(lvadapter); setcontentview(lvlijst); public boolean oncreateoptionsmenu(menu mnoptions) { mnoptions.add(0,add_item,0,r.string.add_item); mnoptions.add(0,endapp,0,r.string.endapp); return true; public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case ADD_ITEM: createitem(); return true; case ENDAPP: finish(); return true; return super.onoptionsitemselected(item); private void createitem() { String itemname = "Item LVvoorbeeld: " + mitemnumber++; mdbhelper.createitem(itemname); lvadapter = getitems(); private SimpleCursorAdapter getitems() { Cursor cur = mdbhelper.fetchallitems();

9 Android UI componenten 9/41 startmanagingcursor(cur); String[] van = new String[] { DBAdapter.KEY_ITEMS_NAME ; int[] naar = new int[] { R.id.text1 ; SimpleCursorAdapter items = new SimpleCursorAdapter(this, R.layout.items_row, cur, van, naar); return items; De uitleg over het gebruik van een database volgt in een volgend hoofdstuk. Spinner Een "Spinner" in Android is eigenlijk een keuzelijst (of "dropdownlist"). De werking is te vergelijken met een ListView. Er wordt ook een "Adapter" gebruikt om de gegevens in de lijst te zetten. Er is een standaard layout gedefinieerd in Android om de gegevens te tonen namelijk "simple_spinner_item". // bibliotheken import android.widget.spinner; // declaraties private Spinner spitems; private ArrayList<String> spstrings = new ArrayList<String>(); private ArrayAdapter<String> spadapter; // in de oncreate functie // spinner invullen spitems = (Spinner) findviewbyid(r.id.spinner1); spadapter = new ArrayAdapter<String>(this, android.r.layout.simple_spinner_item, spstrings); spadapter.add("spitem 1"); spadapter.add("spitem 2"); spadapter.add("spitem 3"); spitems.setadapter(spadapter); spitems.setselection(0); spitems.setonitemselectedlistener(spselected); // spinner selectie OnItemSelectedListener spselected = new AdapterView.OnItemSelectedListener() { public void onitemselected(adapterview<?> adapterview, View view, int i, long l) { Toast.makeText(getApplicationContext(), "spinner item " + String.valueOf(i), Toast.LENGTH_LONG).show();

10 10/41 Android UI componenten public void onnothingselected(adapterview<?> adapterview) { return; ; <Spinner android:id="@+id/spinner1" android:layout_width="100dp" android:layout_weight="0.17" /> Om een "Spinner" te openen klik of tap je op het weergegeven item. Het eerste item uit de lijst heeft het volgnummer 0 omdat het eerste item uit de gebruikte array steeds de index 0 heeft. Net als bij een ListView kan er een schuifbalk verschijnen en kan je door omhoog of omlaag te "swipen" de regels van de lijst verplaatsen. Button Voor elke button moet een "onclicklistener()" functie gedefinieerd worden. Als de gebruiker op de button klikt of tapt dan wordt de code in de "onclicklistener()" functie uitgevoerd. In het voorbeeld wordt een melding op het scherm getoond. // bibliotheken import android.widget.button; // declaraties private Button btn1; private Button btn2; // in de oncreate functie // buttons clicks btn1 = (Button) findviewbyid(r.id.button1); btn1.setonclicklistener(button1click); btn2 = (Button) findviewbyid(r.id.button2); btn2.setonclicklistener(button2click); // button1 click OnClickListener button1click = new OnClickListener() { public void onclick(view v) { Toast.makeText(getApplicationContext(), "button1 geklikt!", Toast.LENGTH_LONG).show(); ; // button2 click OnClickListener button2click = new OnClickListener() { public void onclick(view v) { Toast.makeText(getApplicationContext(), "button2 geklikt!", Toast.LENGTH_LONG).show(); ; Een "Button" kan eenvoudig gedefinieerd worden in de layout met de "<Button>" markering in het "activity_main.xml" bestand. <LinearLayout android:orientation="horizontal"

11 Android UI componenten 11/41 android:layout_height="200dp" > <Button android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:text="button1" /> <Button android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:text="button2" /> </LinearLayout> Een button kan ook een ander uitzicht hebben. Zo kan je bvb. de achtergrond instellen met een kleur. <LinearLayout android:layout_height="50dp" android:orientation="horizontal" > <EditText android:layout_width="450dp" android:layout_height="50dp" android:layout_weight="0.50" android:paddingleft="5dp" android:ems="10" android:textstyle="bold" > </EditText> <Button android:layout_width="wrap_content" android:layout_height="50dp" android:layout_gravity="center_horizontal" android:text="go" /> </LinearLayout> En in de "onclicklistener()" functie kan je de webpagina laten ophalen waarvan de URL vermeld is in het tekstvak aangeduid met "edittext3". OnClickListener btngoclick = new OnClickListener() { public void onclick(view v) { eturl = (EditText) getactivity().findviewbyid(r.id.edittext3); eturl.requestfocus(); LoadWebPageASYNC task = new LoadWebPageASYNC(); task.execute(new String[] { eturl.gettext().tostring() ); ;

12 12/41 Android UI componenten TextView Een "TextView" kan je in Android gebruiken om vaste tekst op het scherm te plaatsen. Je kan het ook een "label" noemen. In Android Studio kan je in het ontwerp ("Design") venster kiezen uit 4 "TextViews". Met het attribuut "android:textappearance" kan je het uitzicht van de tekst wijzigen. <TextView android:id="@+id/textview1" android:layout_width="100dp" android:text="large Text" android:textappearance="?android:attr/textappearancelarge" /> Je kan de inhoud van een "TextView" in de code ook wijzigen. Je gebruikt dan de "settext()" functie van de "TextView". // declaraties private TextView tekst; // in de oncreate functie tekst = (TextView) findviewbyid(r.id.textview1); tekst.settext("nieuwe grote tekst"); EditText Een "EditText" is een tekst "invulvak" in Android. Er zijn verschillende soorten "EditText" views elk met zijn specifieke eigenschappen.

13 Android UI componenten 13/41 In de code kan je net zoals bij een TextView verwijzen naar de layout. In het voorbeeld gebeurt dit in de "onactivitycreated()" functie van het fragment. // bibliotheken import android.widget.edittext; // declaraties private EditText etnaam; private EditText etlocatie; // in de onactivitycreated functie van het fragment etnaam = (EditText) getactivity().findviewbyid(r.id.et_activiteiten_naam); etlocatie = (EditText) getactivity().findviewbyid(r.id.et_activiteiten_locatie); In een aparte eigen geschreven functie kan je dan controleren of de inhoud van de "EditText" view leeg is. if (etnaam.gettext().tostring() == null etnaam.gettext().tostring().trim().length() == 0) { Toast.makeText(getActivity(), "Naam is leeg!", Toast.LENGTH_SHORT).show(); return false; if (etlocatie.gettext().tostring() == null etlocatie.gettext().tostring().trim().length() == 0) { Toast.makeText(getActivity(), "Locatie is leeg!", Toast.LENGTH_SHORT).show(); return false; Je kan de tekstvakken leegmaken met de "settext()" functie van de "EditText" view. Met de functie "requestfocus()" wordt de invoegpositie ("cursor") op de "EditText" view geplaatst. etnaam.settext(""); etlocatie.settext(""); etnaam.requestfocus(); Uiteraard kan je met de "settext()" functie de invulvakken invullen. etnaam.settext(activiteit.getnaam()); etlocatie.settext(activiteit.getlocatie()); Je kan de inhoud van de invulvakken ophalen met de "gettext()" functie. Met de "tostring()" functie kan je er zeker van zijn dat er een "String" wordt gebruikt. objactiviteit = new Activiteit(etnaam.getText().toString(), etlocatie.gettext().tostring(), newdate, newdate,etoms.gettext().tostring()); <LinearLayout android:orientation="horizontal" > <TextView android:id="@+id/tv_activiteiten_naam" android:layout_width="wrap_content" android:text="naam: " android:textstyle="bold" /> <EditText android:id="@+id/et_activiteiten_naam" > </EditText> </LinearLayout> <LinearLayout

14 14/41 Android UI componenten android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:text="locatie: " android:textstyle="bold" /> <EditText > </EditText> </LinearLayout> Radiogroup Een "Radiogroup" kan een aantal "RadioButtons" bevatten. Uit de lijst van "RadioButtons" wordt er 1 bolletje gezet als op de "RadioButton" wordt geklikt of getapt. Je kan de buttons ook een eigen uitzicht geven. In het voorbeeld hieronder wordt de rand van de "RadioButton" lichtblauw gekleurd als de knop geselecteerd is. Om dit effect te bekomen werd er hier gebruik gemaakt van een "Selector" en een "Shape" in de XML bestanden in de map "res/drawable". "rbachtergrond.xml" <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android=" <item android:drawable="@drawable/rbnormaal" android:state_checked="true" android:state_pressed="true" /> <item android:drawable="@drawable/rbselected" android:state_pressed="true" /> <item android:drawable="@drawable/rbselected" android:state_checked="true" /> <item android:drawable="@drawable/rbnormaal" /> </selector>

15 Android UI componenten 15/41 "rbnormaal.xml" <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" android:shape="rectangle" > <corners android:radius="5dp" /> <solid android:color="#fff" /> <stroke android:width="5dp" android:color="#555555" /> </shape> "rbselected.xml" <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" android:shape="rectangle" > <corners android:radius="5dp" /> <solid android:color="#fff" /> <stroke android:width="5dp" android:color="#53aade" /> </shape> In de source code wordt de setoncheckedchangelistener() functie geïmplementeerd. De oncheckedchanged() functie bevat de code die moet uitgevoerd worden als de status van een "RadioButton" gewijzigd werd. // bibliotheken import android.widget.radiobutton; import android.widget.radiogroup; // declaraties RadioGroup rgtalen; // in de onactivitycreated functie van het fragment rgtalen = (RadioGroup) getactivity().findviewbyid(r.id.radiogroup1); rgtalen.setoncheckedchangelistener(new android.widget.radiogroup.oncheckedchangelistener() { public void oncheckedchanged(radiogroup arg0, int arg1) { RadioButton selectedrb = (RadioButton) getactivity().findviewbyid(rgtalen.getcheckedradiobuttonid()); String taal = selectedrb.gettext().tostring(); int catnum; categorieid = categoriesids.get(positie); if (categorieid.tostring() == null categorieid.tostring().trim().length() == 0) { catnum = 0; else { catnum = Integer.valueOf(categorieid); switch (taal.trim()) { case "Nederlands": lvadapter = getvertalingenlistpercat(catnum); lvitems.setadapter(lvadapter); break; case "Engels": lvadapter = getvertalingenengels(catnum); lvitems.setadapter(lvadapter); break; case "Thais": lvadapter = getvertalingenthais(catnum);

16 16/41 Android UI componenten lvitems.setadapter(lvadapter); break; ); In de layout worden de specifieke achtergronden gebruikt voor de "RadioButtons". <LinearLayout android:paddingtop="10dp" android:paddingbottom="1dp" android:orientation="horizontal" > <RadioGroup android:padding="10dp" android:orientation="horizontal" > <RadioButton android:checked="true" android:layout_weight="1" android:text=" Nederlands " android:textsize="28dp" /> <RadioButton android:layout_weight="1" android:text=" Engels " android:textsize="28dp" /> <RadioButton android:layout_weight="1" android:text=" Thais " android:textsize="28dp" /> </RadioGroup> </LinearLayout> GridView De "GridView" voorziet in een rooster waarin een andere "View" kan geplaatst worden. De "Views" worden van links naar rechts ingevuld en van boven naar beneden. Als er geen ruimte meer is verschijnt er een verticale schuifbalk en kan de gebruiker naar beneden en naar boven "scrollen".

17 Android UI componenten 17/41 In het voorbeeld wordt gebruik gemaakt van een "ImageView" voor elke cel in de grid. Het invullen van elke cel gebeurt via een "ImageAdapter" klasse die afgeleid is van de "BaseAdapter". // bibliotheken import android.widget.gridview; // declaratie in de onactivitycreated functie van het fragment GridView gridview = (GridView) getactivity().findviewbyid(r.id.gridview); gridview.setadapter(new ImageAdapter(getActivity())); De "ImageAdapter": import android.content.context; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.gridview; import android.widget.imageview; public class ImageAdapter extends BaseAdapter { private Context mcontext; // Constructor public ImageAdapter(Context c) { mcontext = c; public int getcount() { return mthumbids.length; public Object getitem(int position) { return null; public long getitemid(int position) { return 0; // create a new ImageView for each item referenced by the Adapter public View getview(int position, View convertview, ViewGroup parent) { ImageView imageview; if (convertview == null) { imageview = new ImageView(mContext); imageview.setlayoutparams(new GridView.LayoutParams(195, 195));

18 18/41 Android UI componenten imageview.setscaletype(imageview.scaletype.center_crop); imageview.setpadding(18, 18, 18, 18); else { imageview = (ImageView) convertview; imageview.setimageresource(mthumbids[position]); return imageview; // Keep all Images in array public Integer[] mthumbids = { R.drawable.image001, R.drawable.image002, R.drawable.image003, R.drawable.image004, R.drawable.image005, R.drawable.image006, R.drawable.image007, R.drawable.image008, R.drawable.image009, R.drawable.image010, R.drawable.image011, R.drawable.image012, R.drawable.image013, R.drawable.image014, R.drawable.image015, R.drawable.image016, R.drawable.image001, R.drawable.image002, R.drawable.image003, R.drawable.image004, R.drawable.image005, R.drawable.image006, R.drawable.image007, R.drawable.image008, R.drawable.image009, R.drawable.image010, R.drawable.image011, R.drawable.image012, R.drawable.image013, R.drawable.image014, R.drawable.image015, R.drawable.image016, ; De "ImageView" wordt in de "getview()" functie opgevuld met een image uit de "mthumbids" array. De nummers in deze array verwijzen naar de bestanden die in de map "res/drawable" staan. De individuele foto's worden opgehaald en getoond in een aparte activiteit die met een "Intent" wordt opgeroepen. // in de onactivitycreated functie van het fragment gridview.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> parent, View v, int position, long id) { // Send intent to SingleViewActivity Intent i = new Intent(getActivity(), SingleViewActivity.class); // Pass image index i.putextra("id", position); startactivity(i); ); In de "SingleViewActivity" staat de volgende code in de "oncreate()" functie: // Get intent data Intent i = getintent(); // Selected image id int position = i.getextras().getint("id"); ImageAdapter imageadapter = new ImageAdapter(this); ImageView imageview = (ImageView) findviewbyid(r.id.singleview); imageview.setimageresource(imageadapter.mthumbids[position]); De gebruikte foto's werden voor dit voorbeeld verkleind tot een grootte van 200 op 200 pixels. Je kan een foutmelding "outofmemory" krijgen bij het uitvoeren van de app in het virtual device als de bestandsgrootte van de foto's te groot is.

19 Android UI componenten 19/41 ViewPager Met een "ViewPager" kan je "swipen" van het ene scherm naar het andere (van links naar rechts en van rechts naar links). In het voorbeeld zijn 3 fragmenten aanwezig: LijstFragment, BeheerFragment, TabelFragment. De activiteit zorgt ook voor de tabbladen in de actionbar. Een "ViewPager" object maakt ook gebruik van een adapter. In het voorbeeld is een "SectionsPageAdapter" (sub)klasse ingevoegd die afgeleid is van de "FragmentPagerAdapter". In de "SectionsPageAdapter" klasse zijn 3 functies geïmplementeerd: getitem(), getcount() en getpagetitle(). package com.android.layouts4; import android.app.actionbar; import android.app.fragmenttransaction; import android.content.context; import android.os.bundle; import android.support.v4.app.fragment; import android.support.v4.app.fragmentactivity; import android.support.v4.app.fragmentmanager; import android.support.v4.app.fragmentpageradapter; import android.support.v4.app.navutils; import android.support.v4.view.viewpager; import android.view.gravity; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.widget.textview; public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

20 20/41 Android UI componenten SectionsPagerAdapter msectionspageradapter; ViewPager mviewpager; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); msectionspageradapter = new SectionsPagerAdapter(getSupportFragmentManager()); final ActionBar actionbar = getactionbar(); actionbar.setnavigationmode(actionbar.navigation_mode_tabs); mviewpager = (ViewPager) findviewbyid(r.id.pager); mviewpager.setadapter(msectionspageradapter); mviewpager.setonpagechangelistener(new ViewPager.SimpleOnPageChangeListener() { public void onpageselected(int position) { actionbar.setselectednavigationitem(position); ); for (int i = 0; i < msectionspageradapter.getcount(); i++) { actionbar.addtab(actionbar.newtab().settext(msectionspageradapter.getpagetitle(i)).settablistener(this)); public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.activity_main, menu); return true; public void ontabselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) { mviewpager.setcurrentitem(tab.getposition()); public void ontabunselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) { public void ontabreselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) { public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); public Fragment getitem(int i) { switch (i) { case 0: Fragment lijstfragment = new LijstFragment(); Bundle lijstargs = new Bundle(); lijstargs.putint(dummysectionfragment.arg_section_number, i + 1); lijstfragment.setarguments(lijstargs); return lijstfragment; case 1: Fragment beheerfragment = new BeheerFragment(); Bundle beheerargs = new Bundle(); beheerargs.putint(dummysectionfragment.arg_section_number, i + 1); beheerfragment.setarguments(beheerargs); return beheerfragment; case 2: Fragment tabelfragment = new TabelFragment(); Bundle tabelargs = new Bundle(); tabelargs.putint(dummysectionfragment.arg_section_number, i + 1); tabelfragment.setarguments(tabelargs); return tabelfragment;

21 Android UI componenten 21/41 default: Fragment fragment = new DummySectionFragment(); Bundle args = new Bundle(); args.putint(dummysectionfragment.arg_section_number, i + 1); fragment.setarguments(args); return fragment; public int getcount() { return 3; public CharSequence getpagetitle(int position) { switch (position) { case 0: return getstring(r.string.title_section1).touppercase(); case 1: return getstring(r.string.title_section2).touppercase(); case 2: return getstring(r.string.title_section3).touppercase(); return null; /** * A dummy fragment representing a section of the app, but that simply displays dummy text. */ public static class DummySectionFragment extends Fragment { public DummySectionFragment() { public static final String ARG_SECTION_NUMBER = "section_number"; public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { TextView textview = new TextView(getActivity()); textview.setgravity(gravity.center); Bundle args = getarguments(); textview.settext(integer.tostring(args.getint(arg_section_number))); return textview; <android.support.v4.view.viewpager xmlns:android=" xmlns:tools=" android:id="@+id/pager" android:layout_height="match_parent" tools:context=".mainactivity" /> Tabbladen Tabbladen kunnen op verschillende manieren geïmplementeerd worden in Android. In het voorbeeld van de "ViewPager" werden tabbladen voorzien in de actionbar met de volgende code: public class MainActivity extends FragmentActivity implements ActionBar.TabListener { In de activiteit zijn ook de volgende functies opgenomen voor de tabbladen:

22 22/41 Android UI componenten public void ontabselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) { mviewpager.setcurrentitem(tab.getposition()); public void ontabunselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) { public void ontabreselected(actionbar.tab tab, FragmentTransaction fragmenttransaction) { Daarnaast kan je ook nog op een andere manier tabbladen gebruiken. In het voorbeeld hieronder zie je 3 tabbladen. In de code wordt gebruik gemaakt van het "TabHost" object en zijn "TabSpec" objecten. De activiteit is afgeleid van de "TabActivity" klasse. package com.android.layouts3; import android.os.bundle; import android.app.tabactivity; import android.content.intent; import android.view.menu; import android.widget.tabhost; import public class MainActivity extends TabActivity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); TabHost tabhost = gettabhost(); TabSpec spec1=tabhost.newtabspec("tab 1"); spec1.setindicator("tab 1"); Intent in1=new Intent(this, Act1.class); spec1.setcontent(in1); TabSpec spec2=tabhost.newtabspec("tab 2"); spec2.setindicator("tab 2"); Intent in2=new Intent(this,Act2.class);

23 Android UI componenten 23/41 spec2.setcontent(in2); TabSpec spec3=tabhost.newtabspec("tab 3"); spec3.setindicator("tab 3"); Intent in3=new Intent(this,Act3.class); spec3.setcontent(in3); tabhost.addtab(spec1); tabhost.addtab(spec2); tabhost.addtab(spec3); public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.activity_main, menu); return true; In de FrameLayout ("tabcontent") worden de schermen van de activiteiten getoond. <RelativeLayout xmlns:android=" xmlns:tools=" android:layout_height="match_parent" > <TabHost android:id="@android:id/tabhost" android:layout_height="match_parent" android:layout_alignparentleft="true" android:layout_alignparenttop="true" > <LinearLayout android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" > </TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_height="match_parent" > </FrameLayout> </LinearLayout> </TabHost> </RelativeLayout>

24 24/41 Android UI componenten NavigationDrawer Een "NavigationDrawer" is een schuifbalk die links verschijnt als je vanaf de linker rand veegt of als je op de "Home" knop links in de actionbar drukt. De schuifbalk bevat een lijst met bvb. fragment namen. Op deze manier kan je jouw app opdelen in logische onderdelen (of secties). package android.taaldb; import android.app.activity; import android.content.intent; import android.support.v7.app.actionbaractivity; import android.support.v7.app.actionbar; import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.content.context; import android.os.build; import android.os.bundle; import android.view.gravity; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.support.v4.widget.drawerlayout; import android.widget.arrayadapter; import android.widget.textview; public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks { /** * Fragment managing the behaviors, interactions and presentation of the navigation drawer. */ private NavigationDrawerFragment mnavigationdrawerfragment; /** * Used to store the last screen title. For use in {@link #restoreactionbar(). */ private CharSequence mtitle;

25 Android UI componenten 25/41 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mnavigationdrawerfragment = (NavigationDrawerFragment) getsupportfragmentmanager().findfragmentbyid(r.id.navigation_drawer); mtitle = getstring(r.string.categorie); //gettitle(); // Set up the drawer. mnavigationdrawerfragment.setup( R.id.navigation_drawer, (DrawerLayout) findviewbyid(r.id.drawer_layout)); public void onnavigationdraweritemselected(int position) { // update the main content by replacing fragments Fragment fragment = null; switch (position) { case 0: fragment = new CategoriesFragment(); mtitle = getstring(r.string.categorie); break; case 1: fragment = new VertalingenFragment(); mtitle = getstring(r.string.vertaling); break; case 2: fragment = new ZoekenFragment(); mtitle = getstring(r.string.zoeken); break; default: break; if (fragment!= null) { FragmentManager fragmentmanager = getsupportfragmentmanager(); fragmentmanager.begintransaction().replace(r.id.container, fragment).commit(); else { FragmentManager fragmentmanager = getsupportfragmentmanager(); fragmentmanager.begintransaction().replace(r.id.container, PlaceholderFragment.newInstance(position + 1)).commit(); public void onsectionattached(int number) { switch (number) { case 1: mtitle = getstring(r.string.categorie); break; case 2: mtitle = getstring(r.string.vertaling); break; case 3: mtitle = getstring(r.string.zoeken); break; public void restoreactionbar() { ActionBar actionbar = getsupportactionbar(); actionbar.setnavigationmode(actionbar.navigation_mode_standard); actionbar.setdisplayshowtitleenabled(true); actionbar.settitle(mtitle);

26 26/41 Android UI componenten public boolean oncreateoptionsmenu(menu menu) { if (!mnavigationdrawerfragment.isdraweropen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getmenuinflater().inflate(r.menu.main, menu); restoreactionbar(); return true; return super.oncreateoptionsmenu(menu); public boolean onoptionsitemselected(menuitem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. // Handle action buttons switch(item.getitemid()) { case R.id.menu_settings: //startactivity(new Intent(this, Preferences.class)); return true; case R.id.menu_endapp: finish(); return true; return super.onoptionsitemselected(item); public static class PlaceholderFragment extends Fragment { private static final String ARG_SECTION_NUMBER = "section_number"; public static PlaceholderFragment newinstance(int sectionnumber) { PlaceholderFragment fragment = new PlaceholderFragment(); Bundle args = new Bundle(); args.putint(arg_section_number, sectionnumber); fragment.setarguments(args); return fragment; public PlaceholderFragment() { public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { View rootview = inflater.inflate(r.layout.fragment_main, container, false); return rootview; public void onattach(activity activity) { super.onattach(activity); ((MainActivity) activity).onsectionattached( getarguments().getint(arg_section_number)); package android.taaldb; import android.support.v7.app.actionbaractivity; import android.app.activity; import android.support.v7.app.actionbar;

27 Android UI componenten 27/41 import android.support.v4.app.fragment; import android.support.v4.app.actionbardrawertoggle; import android.support.v4.view.gravitycompat; import android.support.v4.widget.drawerlayout; import android.content.sharedpreferences; import android.content.res.configuration; import android.os.bundle; import android.preference.preferencemanager; import android.view.layoutinflater; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.listview; import android.widget.toast; /** * Fragment used for managing interactions for and presentation of a navigation drawer. * See the <a href=" * design guidelines</a> for a complete explanation of the behaviors implemented here. */ public class NavigationDrawerFragment extends Fragment { /** * Remember the position of the selected item. */ private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; /** * Per the design guidelines, you should show the drawer on launch until the user manually * expands it. This shared preference tracks this. */ private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned"; /** * A pointer to the current callbacks instance (the Activity). */ private NavigationDrawerCallbacks mcallbacks; /** * Helper component that ties the action bar to the navigation drawer. */ private ActionBarDrawerToggle mdrawertoggle; private DrawerLayout mdrawerlayout; private ListView mdrawerlistview; private View mfragmentcontainerview; private int mcurrentselectedposition = 0; private boolean mfromsavedinstancestate; private boolean muserlearneddrawer; public NavigationDrawerFragment() { public void oncreate(bundle savedinstancestate) {

28 28/41 Android UI componenten super.oncreate(savedinstancestate); // Read in the flag indicating whether or not the user has demonstrated awareness of the // drawer. See PREF_USER_LEARNED_DRAWER for details. SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); muserlearneddrawer = sp.getboolean(pref_user_learned_drawer, false); if (savedinstancestate!= null) { mcurrentselectedposition = savedinstancestate.getint(state_selected_position); mfromsavedinstancestate = true; // Select either the default item (0) or the last selected item. selectitem(mcurrentselectedposition); public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); // Indicate that this fragment would like to influence the set of actions in the action bar. sethasoptionsmenu(true); public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { mdrawerlistview = (ListView) inflater.inflate( R.layout.fragment_navigation_drawer, container, false); mdrawerlistview.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> parent, View view, int position, long id) { selectitem(position); ); mdrawerlistview.setadapter(new ArrayAdapter<String>( getactionbar().getthemedcontext(), android.r.layout.simple_list_item_activated_1, android.r.id.text1, new String[]{ getstring(r.string.categorie), getstring(r.string.vertaling), getstring(r.string.zoeken), )); mdrawerlistview.setitemchecked(mcurrentselectedposition, true); return mdrawerlistview; public boolean isdraweropen() { return mdrawerlayout!= null && mdrawerlayout.isdraweropen(mfragmentcontainerview); /** * Users of this fragment must call this method to set up the navigation drawer interactions. * fragmentid The android:id of this fragment in its activity's layout. drawerlayout The DrawerLayout containing this fragment's UI. */ public void setup(int fragmentid, DrawerLayout drawerlayout) { mfragmentcontainerview = getactivity().findviewbyid(fragmentid); mdrawerlayout = drawerlayout;

29 Android UI componenten 29/41 // set a custom shadow that overlays the main content when the drawer opens mdrawerlayout.setdrawershadow(r.drawable.drawer_shadow, GravityCompat.START); // set up the drawer's list view with items and click listener ActionBar actionbar = getactionbar(); actionbar.setdisplayhomeasupenabled(true); actionbar.sethomebuttonenabled(true); // ActionBarDrawerToggle ties together the the proper interactions // between the navigation drawer and the action bar app icon. mdrawertoggle = new ActionBarDrawerToggle( getactivity(), /* host Activity */ mdrawerlayout, /* DrawerLayout object */ R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ) { public void ondrawerclosed(view drawerview) { super.ondrawerclosed(drawerview); if (!isadded()) { return; getactivity().supportinvalidateoptionsmenu(); // calls onprepareoptionsmenu() public void ondraweropened(view drawerview) { super.ondraweropened(drawerview); if (!isadded()) { return; if (!muserlearneddrawer) { // The user manually opened the drawer; store this flag to prevent auto-showing // the navigation drawer automatically in the future. muserlearneddrawer = true; SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity()); sp.edit().putboolean(pref_user_learned_drawer, true).apply(); ; getactivity().supportinvalidateoptionsmenu(); // calls onprepareoptionsmenu() // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, // per the navigation drawer design guidelines. if (!muserlearneddrawer &&!mfromsavedinstancestate) { mdrawerlayout.opendrawer(mfragmentcontainerview); // Defer code dependent on restoration of previous instance state. mdrawerlayout.post(new Runnable() { public void run() { mdrawertoggle.syncstate(); ); mdrawerlayout.setdrawerlistener(mdrawertoggle);

30 30/41 Android UI componenten private void selectitem(int position) { mcurrentselectedposition = position; if (mdrawerlistview!= null) { mdrawerlistview.setitemchecked(position, true); if (mdrawerlayout!= null) { mdrawerlayout.closedrawer(mfragmentcontainerview); if (mcallbacks!= null) { mcallbacks.onnavigationdraweritemselected(position); public void onattach(activity activity) { super.onattach(activity); try { mcallbacks = (NavigationDrawerCallbacks) activity; catch (ClassCastException e) { throw new ClassCastException("Activity must implement NavigationDrawerCallbacks."); public void ondetach() { super.ondetach(); mcallbacks = null; public void onsaveinstancestate(bundle outstate) { super.onsaveinstancestate(outstate); outstate.putint(state_selected_position, mcurrentselectedposition); public void onconfigurationchanged(configuration newconfig) { super.onconfigurationchanged(newconfig); // Forward the new configuration the drawer toggle component. mdrawertoggle.onconfigurationchanged(newconfig); public void oncreateoptionsmenu(menu menu, MenuInflater inflater) { // If the drawer is open, show the global app actions in the action bar. See also // showglobalcontextactionbar, which controls the top-left area of the action bar. if (mdrawerlayout!= null && isdraweropen()) { inflater.inflate(r.menu.global, menu); showglobalcontextactionbar(); super.oncreateoptionsmenu(menu, inflater); public boolean onoptionsitemselected(menuitem item) { if (mdrawertoggle.onoptionsitemselected(item)) { return true; /* if (item.getitemid() == R.id.action_example) {

31 Android UI componenten 31/41 */ Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show(); return true; return super.onoptionsitemselected(item); /** * Per the navigation drawer design guidelines, updates the action bar to show the global app * 'context', rather than just what's in the current screen. */ private void showglobalcontextactionbar() { ActionBar actionbar = getactionbar(); actionbar.setdisplayshowtitleenabled(true); actionbar.setnavigationmode(actionbar.navigation_mode_standard); actionbar.settitle(r.string.app_name); private ActionBar getactionbar() { return ((ActionBarActivity) getactivity()).getsupportactionbar(); /** * Callbacks interface that all activities using this fragment must implement. */ public static interface NavigationDrawerCallbacks { /** * Called when an item in the navigation drawer is selected. */ void onnavigationdraweritemselected(int position); AlertDialog Een "AlertDialog" is een pop-up venster dat volledig aan te passen is aan jouw wensen. Je geeft een titel op ("settitle()"), voorziet een bericht ("setmessage()") en duid aan wat er moet gebeuren bij de "positieve" knop ("setpositivebutton()") en bij de "negatieve" knop ("setnegativebutton()"). Uiteindelijk wordt het venster getoond met de functie "show()" van het "AlertDialog.Builder" object. AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); alert.settitle(r.string.notadelete_title); alert.setmessage(ettitel.gettext().tostring()); alert.setpositivebutton(r.string.notadeleteok, new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { // delete nota objnota = new Nota(rowid,ettitel.getText().toString(),ettekst.getText().toString()); objdbhelper.deletenota(objnota);

32 32/41 Android UI componenten refreshscreen(); spnotasadapter = getnotaslist(); spnotas.setadapter(spnotasadapter); ); alert.setnegativebutton(r.string.notadeletecancel, new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { // geen delete ); alert.show(); Je kan in het "message" gedeelte ook nog meerdere "Views" opnemen zoals je in het onderstaande voorbeeld ziet. Met de "setview()" functie van het "AlertDialog.Builder" object wordt de omsluitende "View" toegevoegd (in het voorbeeld de "LinearLayout" "Viewgroup"). AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); alert.settitle(r.string.websites_title); alert.setmessage(r.string.webadres); llwebsites = new LinearLayout(getActivity()); llwebsites.setorientation(linearlayout.vertical); llwebsites.setlayoutparams(new LayoutParams(500, 600)); TextView tvnaam = new TextView(getActivity()); tvnaam.settext(" Naam"); llwebsites.addview(tvnaam); naam = new EditText(getActivity()); llwebsites.addview(naam); TextView tvinput = new TextView(getActivity()); tvinput.settext(" URL"); llwebsites.addview(tvinput); input = new EditText(getActivity()); llwebsites.addview(input); TextView tvoms = new TextView(getActivity()); tvoms.settext(" Omschrijving (optioneel)"); llwebsites.addview(tvoms); oms = new EditText(getActivity()); llwebsites.addview(oms); alert.setview(llwebsites); alert.setpositivebutton(r.string.websitesok, new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { // insert website if (validatie() == true) { Website ws = new Website(naam.getText().toString(), input.gettext().tostring(), oms.gettext().tostring()); db.createwebsite(ws);

33 Android UI componenten 33/41 mspinneradapter = getwebsites(); actionbar.setlistnavigationcallbacks(mspinneradapter,monnavigationlistener); ); alert.setnegativebutton(r.string.websitescancel, new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { // geen update ); alert.show(); Imageview Als je een afbeelding wil gebruiken in jouw app dan kan je een "ImageView" gebruiken. Je koppelt de "ImageView" aan de "ImageView" layout en je gebruikt bvb. de "setimageresource()" functie om de afbeelding op te halen uit de "res/drawable" map. // bibliotheken import android.widget.imageview; // in de oncreate functie ImageView imview = (ImageView) findviewbyid(r.id.imageview); imview.setimageresource(r.drawable.speelkaarten); <ImageView android:id="@+id/imageview" android:layout_width="180dp" android:layout_height="240dp" android:layout_gravity="center_horizontal" /> Je kan dezelfde afbeelding met Java source code ook ophalen zoals je kan zien in het volgende voorbeeld. De afbeelding is dezelfde.

34 34/41 Android UI componenten In de "oncreateview()" functie van het "BeheerFragment" wordt een "LinearLayout" met daarin een "ImageView" en een "TextView" gedefinieerd. package com.android.layouts4; import android.graphics.drawable.drawable; import android.os.bundle; import android.support.v4.app.fragment; import android.view.gravity; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.imageview; import android.widget.linearlayout; import android.widget.textview; import android.widget.linearlayout.layoutparams; public class BeheerFragment extends Fragment { private Drawable imagefile; private ImageView imview; private LinearLayout llmain; public BeheerFragment() { public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { llmain = new LinearLayout(getActivity()); llmain.setorientation(linearlayout.vertical); llmain.setlayoutparams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); llmain.setgravity(gravity.center_horizontal); imagefile = getactivity().getresources().getdrawable(r.drawable.speelkaarten); imview = new ImageView(getActivity()); imview.setlayoutparams(new LayoutParams(100, 200)); imview.setimagedrawable(imagefile); llmain.addview(imview); TextView textview = new TextView(getActivity()); textview.setgravity(gravity.center); textview.settext("beheerfragment"); llmain.addview(textview); return llmain;

35 Android UI componenten 35/41 WebView Zoals de naam al doet vermoeden kan je met een "WebView" webpagina's tonen in een app. Als je dubbelklikt of tweemaal kort na mekaar op de "WebView" drukt wordt de pagina vergroot. Met duim en wijsvinger naar mekaar of van mekaar weg vegen op de "WebView" zorgt voor een aangepaste vergroting van de pagina. // bibliotheken import android.net.uri; import android.os.asynctask; import android.webkit.webview; import android.webkit.webviewclient; // declaraties private WebView webview; // in de onactivitycreated functie van het fragment webview = (WebView) getactivity().findviewbyid(r.id.webview1); webview.setwebviewclient(new mywebviewclient()); // Android (17) webview sluit app als Javascript wordt gebruikt!!! if(build.version.sdk_int < 16){ webview.getsettings().setjavascriptenabled(true); else { webview.getsettings().setjavascriptenabled(false); if(build.version.sdk_int == 19) { webview.getsettings().setjavascriptenabled(true); webview.getsettings().setbuiltinzoomcontrols(true); webview.getsettings().setloadwithoverviewmode(true); webview.getsettings().setusewideviewport(true); LoadWebPageASYNC task = new LoadWebPageASYNC(); task.execute(new String[] { " ); // achtergrond taak om een webpagina te laden private class LoadWebPageASYNC extends AsyncTask<String, Void, String> { protected String doinbackground(string... urls) { return urls[0];

36 36/41 Android UI componenten protected void onpostexecute(string result) { webview.loadurl(result); // WebViewClient klasse om de verwerking van hyperlink clicks op te vangen public class mywebviewclient extends WebViewClient { private String newurl; public void onpagestarted(webview view, String url, Bitmap favicon) { super.onpagestarted(view, url, favicon); eturl.settext(url); eturl.requestfocus(); public void onreceivederror(webview view, int errorcode, String description, String failingurl) { Log.d("Webview client", "error code:" + errorcode + " - " + description); public boolean shouldoverrideurlloading(webview view, String url) { try { if (url.endswith(".pdf") url.endswith(".apk") url.endswith(".doc") url.endswith(".docx") url.endswith(".xls") url.endswith(".xlsx") url.endswith(".ppt") url.endswith(".pptx")) { startactivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return true; else { if (url.equals("about:blank")) return true; view.loadurl(url); return true; catch (Exception e) { Log.v("Webclient shouldoverrideurlloading",e.tostring()); return true; public void onbackpressed() { // geen actie omdat de knop in de actionbar moet gebruikt worden /* public void onbackpressed() { if ((webview!= null) && (webview.cangoback())) { if (webview.geturl() == null) { webview.goback(); webview.goback(); else { super.getactivity().onbackpressed(); */

37 Android UI componenten 37/41 OptionsMenu Gewoonlijk verschijnt er een menu knopje rechts bovenaan. Als je erop drukt (of klikt) wordt de menutekst getoond. Je kan voor menu-ingangen een icoontje voorzien (die in de actionbar kunnen getoond worden). Op sommige tabletten en smartphones is er een hardware knop op het toestel dat ook de menu toont als je erop drukt. De menu kan dan onderaan verschijnen. public void oncreateoptionsmenu(menu menu, MenuInflater inflater) { inflater.inflate(r.menu.activiteiten_menu, menu); super.oncreateoptionsmenu(menu, public boolean onoptionsitemselected(menuitem mnitem) { try { Fragment fragment = null; switch (mnitem.getitemid()) { case R.id.menu_settings: return false; case R.id.menu_toevoegen_activiteit: insert_activiteit(); return true; case R.id.menu_wijzigen_activiteit: update_activiteit(); return true; case R.id.menu_verwijderen_activiteit: delete_activiteit(); return true; case R.id.menu_kalender_fragment: fragment = new KalenderFragment(); if (fragment!= null) { android.support.v4.app.fragmentmanager fragmentmanager = getfragmentmanager(); FragmentTransaction fragmenttransaction = fragmentmanager.begintransaction(); fragmenttransaction.replace(r.id.content_frame, fragment); fragmenttransaction.commit(); return true; case R.id.menu_ongedaan_maken: refreshscreen(); return true; case R.id.menu_endapp: return false; default: return super.onoptionsitemselected(mnitem);

38 38/41 Android UI componenten catch (Exception e) { Log.v("Activiteiten fragment onoptionsitemselected", e.tostring()); finally { return true; Met het attribuut "android:showasaction" geef je aan of er een icoontje in de actionbar mag verschijnen ("ifroom") of niet ("never"). Als er geen icoontje kan getoond worden (op een smartphone bvb.) dan wordt de menu-ingang tekst in de menu getoond. <menu xmlns:android=" > <item android:id="@+id/menu_ongedaan_maken" android:icon="@drawable/ic_action_back" android:title="@string/menu_ongedaan_maken" android:orderincategory="700" android:showasaction="ifroom" /> <item android:id="@+id/menu_toevoegen_activiteit" android:icon="@drawable/ic_action_new" android:title="@string/menu_toevoegen_site" android:orderincategory="701" android:showasaction="ifroom" /> <item android:id="@+id/menu_wijzigen_activiteit" android:icon="@drawable/ic_action_edit" android:title="@string/menu_wijzigen_site" android:orderincategory="702" android:showasaction="ifroom" /> <item android:id="@+id/menu_verwijderen_activiteit" android:icon="@drawable/ic_action_discard" android:title="@string/menu_verwijderen_site" android:orderincategory="703" android:showasaction="ifroom" /> <item android:id="@+id/menu_kalender_fragment" android:icon="@drawable/ic_action_new" android:title="@string/menu_kalender_fragment" android:orderincategory="704" android:showasaction="never" /> </menu> Als je een verschillend "OptionsMenu" per fragment wil gebruiken dan moet je in de "oncreate()" functie van het fragment de functie "sethasoptionsmenu(true)" aanroepen. public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); sethasoptionsmenu(true);

39 Android UI componenten 39/41 DatePickerDialog Om een datum te selecteren kan je gebruik maken van een "DatePickerDialog" venster (in het voorbeeld geïmplementeerd in een "DialogFragment"). DialogFragment newfragment = new DatePickerFragment1(); newfragment.show(getfragmentmanager(), "datepicker"); public static class DatePickerFragment1 extends DialogFragment implements DatePickerDialog.OnDateSetListener { public Dialog oncreatedialog(bundle savedinstancestate) { // Use the current date as the default date in the picker final Calendar c = Calendar.getInstance(); int year = c.get(calendar.year); int month = c.get(calendar.month); int day = c.get(calendar.day_of_month); // Create a new instance of DatePickerDialog and return it return new DatePickerDialog(getActivity(), this, year, month, day); public void ondateset(datepicker view, int year, int month, int day) { // Do something with the date chosen by the user jaar = String.valueOf(year); if (month+1 < 10) { maand = "0" + String.valueOf(month + 1); else { maand = String.valueOf(month + 1); if (day < 10) { dag = "0" + String.valueOf(day); else { dag = String.valueOf(day); etvan.settext(jaar + "-" + maand + "-" + dag);

40 40/41 Android UI componenten CalendarView Met een "CalendarView" kan je een kalender op het scherm zetten. Als je op een datum drukt wordt er voor die datum in het voorbeeld de activiteiten eronder getoond. De weergave wijzigt als je van boven naar onder of van onder naar boven veegt. De maandtitel past zich automatisch aan. // bibliotheken import android.widget.calendarview; // declaraties private CalendarView cvkalender; SimpleDateFormat datumformaat; // in de onactivitycreated functie van het fragment cvkalender = (CalendarView) getactivity().findviewbyid(r.id.calendarview1); cvkalender.setondatechangelistener(datechange); datumformaat = new SimpleDateFormat("yyyy-MM-dd"); String dat = datumformaat.format(calendar.getinstance().gettime()); toon_activiteiten(dat); OnDateChangeListener datechange = new OnDateChangeListener() { public void onselecteddaychange(calendarview view, int year, int month, int dayofmonth) { String datum = datumformaat.format(view.getdate()); toon_activiteiten(datum); ; Toast Als je berichten op het scherm wil zetten kan je gebruik maken van een "Toast" object. Met de "maketext()" functie van het "Toast" object kan je kort of lang (enkele seconden) een bericht tonen.

Een fragment wordt afgeleid van de basis klasse "Fragment".

Een fragment wordt afgeleid van de basis klasse Fragment. Android fragmenten 1/5 Fragmenten Klasse Een fragment wordt afgeleid van de basis klasse "Fragment". package com.android.cursustekst; import java.text.simpledateformat; import java.util.arraylist; import

Nadere informatie

Java code onderdelen. Variabelen. Constanten. Android Java code onderdelen 1/7

Java code onderdelen. Variabelen. Constanten. Android Java code onderdelen 1/7 Android Java code onderdelen 1/7 Java code onderdelen Variabelen Java maakt zoals elke programmeertaal gebruik van variabelen. Variabelen zijn geheugenplaatsen waarvan de inhoud kan gewijzigd worden. Je

Nadere informatie

APPI Labo. Leo Rutten 10/ 4/2017

APPI Labo. Leo Rutten 10/ 4/2017 Leo Rutten 10/ 4/2017 Inhoudsopgave 1. Inleiding... 1 2. Eerste kennismaking met Linux... 1 3. Het eerste voorbeeld... 2 3.1. Het voorbeeld bekijken... 2 3.2. Het voorbeeld uitbreiden... 9 3.2.1. build.gradle

Nadere informatie

App onderdelen. Source files. Android app onderdelen 1/6

App onderdelen. Source files. Android app onderdelen 1/6 Android app onderdelen 1/6 App onderdelen Een Android project bestaat uit een aantal onderdelen die hieronder beschreven worden. In het project venster kan je de mappen weergeven volgens de hieronder aangeduide

Nadere informatie

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, 8.30-10.30 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde

Nadere informatie

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, 8.30-10.30 uur 1. Een Intent-object wordt gebruikt voor communicatie (a) van een Activity naar een bijbehorende View

Nadere informatie

Shipment Centre EU Quick Print Client handleiding [NL]

Shipment Centre EU Quick Print Client handleiding [NL] Shipment Centre EU Quick Print Client handleiding [NL] Please scroll down for English. Met de Quick Print Client kunt u printers in Shipment Centre EU configureren. De Quick Print Client kan alleen op

Nadere informatie

MyDHL+ Van Non-Corporate naar Corporate

MyDHL+ Van Non-Corporate naar Corporate MyDHL+ Van Non-Corporate naar Corporate Van Non-Corporate naar Corporate In MyDHL+ is het mogelijk om meerdere gebruikers aan uw set-up toe te voegen. Wanneer er bijvoorbeeld meerdere collega s van dezelfde

Nadere informatie

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B;

public Bier ( string N, double P, Brouwerij B) { Naam = N; AlcoholPerc = P; Brouwer = B; Beschouw bijvoorbeeld de twee onderstaande klassen, waarvan de attributen en eigenschappen geannoteerd zijn met bijkomende XML-annotaties: using System ; using System. Xml ; using System. Xml. S e r i

Nadere informatie

Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 23 december 2016, uur

Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 23 december 2016, uur Uitwerking Eerste deeltentamen Mobiel programmeren - versie 1 Vrijdag 23 december 2016, 11.00-13.00 uur 1. Een klasse is niet: (a) het type van een object (b) een groepje methoden (c) een groepje variabelen

Nadere informatie

Dan stel ik u graag voor aan Android. Een besturingssysteem voor gsm s uitgebracht door de welgekende firma Google.

Dan stel ik u graag voor aan Android. Een besturingssysteem voor gsm s uitgebracht door de welgekende firma Google. Verslag Android GSM Je kan gsm s en hun gebruik op delen in 2 groepen. Sommige mensen gebruiken het enkel voor te bellen en eens een sms te versturen, voor de rest hebben ze enkel nood aan een adressenboek.

Nadere informatie

Functioneel Ontwerp / Wireframes:

Functioneel Ontwerp / Wireframes: Functioneel Ontwerp / Wireframes: Het functioneel ontwerp van de ilands applicatie voor op de iphone is gebaseerd op het iphone Human Interface Guidelines handboek geschreven door Apple Inc 2007. Rounded-Rectangle

Nadere informatie

Katholieke Hogeschool Kempen ASP

Katholieke Hogeschool Kempen ASP Katholieke Hogeschool Kempen Campus Geel Departement Handelswetenschappen en Bedrijfskunde 3de jaar Toegepaste Informatica ASP www.projectchatroom.be Yorkim Parmentier 3TI4 Andy Geluykens 3TI4 Academiejaar

Nadere informatie

Werkomgeving. Android Studio. Android - werkomgeving 1/6

Werkomgeving. Android Studio. Android - werkomgeving 1/6 Android - werkomgeving 1/6 Werkomgeving Android Studio Installatie Ga naar de volgende URL: http://developer.android.com/sdk/index.html Klik op de knop "Download Android Studio for Windows" om het programma

Nadere informatie

Instructie Beheren Cases

Instructie Beheren Cases Instructie Beheren Cases Om een vraag in te dienen met betrekking tot de werking van de software kunt u gebruik maken van onze portal. U gaat dan een Case aanmaken. Aanmaken Case Om een nieuwe case aan

Nadere informatie

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 3 februari 2017, uur

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 3 februari 2017, uur Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 3 februari 2017, 8.30-10.30 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde

Nadere informatie

programmeren Mobiel Mobilofoon 1960 Apple iphone 2007 met ios Nokia Samsung S met Android Motorola Dyna-Tac 1973

programmeren Mobiel Mobilofoon 1960 Apple iphone 2007 met ios Nokia Samsung S met Android Motorola Dyna-Tac 1973 Mobiel programmeren Mobilofoon 1960 Nokia 3310 2000 Apple iphone 2007 met ios Motorola Dyna-Tac 1973 Samsung S7 2016 met Android Programmeertalen Fortran Basic C++ C# Android Algol C Java... 1950 1960

Nadere informatie

WIDGETKIT 2. Inleiding

WIDGETKIT 2. Inleiding WIDGETKIT 2 Inleiding Widgetkit 2 is een component wat in Joomla te gebruiken is. Het component bevat een aantal Widgets die elk op zijn eigen manier content op de website weergeeft. Hieronder is te zien

Nadere informatie

Kleine cursus PHP5. Auteur: Raymond Moesker

Kleine cursus PHP5. Auteur: Raymond Moesker Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven

Nadere informatie

Firewall van de Speedtouch 789wl volledig uitschakelen?

Firewall van de Speedtouch 789wl volledig uitschakelen? Firewall van de Speedtouch 789wl volledig uitschakelen? De firewall van de Speedtouch 789 (wl) kan niet volledig uitgeschakeld worden via de Web interface: De firewall blijft namelijk op stateful staan

Nadere informatie

Inleiding Appontwikkeling. Inleiding Appontwikkeling

Inleiding Appontwikkeling. Inleiding Appontwikkeling Inleiding Appontwikkeling i Inleiding Appontwikkeling Inleiding Appontwikkeling ii Copyright 2016-2017 Leo Rutten Permission is granted to copy, distribute and/or modify this document under the terms of

Nadere informatie

2019 SUNEXCHANGE USER GUIDE LAST UPDATED

2019 SUNEXCHANGE USER GUIDE LAST UPDATED 2019 SUNEXCHANGE USER GUIDE LAST UPDATED 0 - -19 1 WELCOME TO SUNEX DISTRIBUTOR PORTAL This user manual will cover all the screens and functions of our site. MAIN SCREEN: Welcome message. 2 LOGIN SCREEN:

Nadere informatie

Om de toegang te krijgen tot de. download het programma. http://retroshare.sourceforge.net/downloads.html

Om de toegang te krijgen tot de. download het programma. http://retroshare.sourceforge.net/downloads.html www.vhn-online.nl Om de toegang te krijgen tot de download het programma http://retroshare.sourceforge.net/downloads.html Na het downloaden installeer en open het programma. Aan u wordt gevraagd: Create

Nadere informatie

! GeoNetwork INSPIRE Atom!

! GeoNetwork INSPIRE Atom! GeoNetwork INSPIRE Atom GeoNetwork INSPIRE Atom 1 Configuration 2 Metadata editor 3 Services 3 Page 1 of 7 Configuration To configure the INSPIRE Atom go to Administration > System configuration and enable

Nadere informatie

Handleiding Toggl Android

Handleiding Toggl Android Handleiding Toggl Nadat je Toggl hebt opgestart krijg je het volgende scherm. Als je al een account hebt vul je je inloggegevens in. Indien dit niet het geval is kan je via Create account een account aanmaken.

Nadere informatie

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren Universiteit van Amsterdam FNWI Voorbeeld van tussentoets Inleiding programmeren Opgave 1: Wat is de uitvoer van dit programma? public class Opgave { static int i = 0 ; static int j = 1 ; int i = 1 ; int

Nadere informatie

Het beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14

Het beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14 QUICK GUIDE C Het beheren van mijn Tungsten Network Portal account NL 1 Manage my Tungsten Network Portal account EN 14 Version 0.9 (June 2014) Per May 2014 OB10 has changed its name to Tungsten Network

Nadere informatie

MyDHL+ Uw accountnummer(s) delen

MyDHL+ Uw accountnummer(s) delen MyDHL+ Uw accountnummer(s) delen met anderen Uw accountnummer(s) delen met anderen in MyDHL+ In MyDHL+ is het mogelijk om uw accountnummer(s) te delen met anderen om op uw accountnummer een zending te

Nadere informatie

Icoon/Icon Betekenis Description. Change scheduling Online. Gaat offline op (datum/tijd) Online. Going offline on (date/time)

Icoon/Icon Betekenis Description. Change scheduling Online. Gaat offline op (datum/tijd) Online. Going offline on (date/time) Algemeen/General Gepubliceerd maar gewijzigd Published but changed Meer acties op geselecteerde content More actions on selected content Gepubliceerd en niet gewijzigd Published and not changed Terugdraaien

Nadere informatie

[BP-ebMS-H-000] Welke versie van Hermes moet er gebruikt worden?

[BP-ebMS-H-000] Welke versie van Hermes moet er gebruikt worden? [BP-ebMS-H-000] Welke versie van Hermes moet er gebruikt worden? Gebruik altijd de laatste versie omdat er serieuse bug-fixes in kunnen zitten. Check altijd de release notes en openstaande bugs. Er is

Nadere informatie

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 29 januari 2016, uur

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 29 januari 2016, uur Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 29 januari 2016, 11.00-13.00 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde

Nadere informatie

Release notes Mosaic 1.3.0

Release notes Mosaic 1.3.0 Release notes Mosaic 1.3.0 Copyright 2016 Swing Mosaic Swing Mosiac is een product van ABF Research Algemeen (Technische) verbeteringen Een aantal (technische) verbeteringen zijn hiervoor doorgevoerd,

Nadere informatie

Procedure Reset tv-toestellen:

Procedure Reset tv-toestellen: Procedure Reset tv-toestellen: Volgende procedure is te volgen wanneer er een tv-toestel, op een van de kamers niet meer werkt. TV Re-installation Factory Default Her-installeren van de TV Fabrieksinstellingen

Nadere informatie

Uitleg CMS Utrecht Your Way Button 1. Inloggen

Uitleg CMS Utrecht Your Way Button 1. Inloggen Uitleg CMS Utrecht Your Way Button 1. Inloggen Met jouw login gegevens kun je inloggen via http://button.utrechtyourway.nl/cms 2. Dashboard Na inloggen wordt het dashboard van het CMS zichtbaar. Of te

Nadere informatie

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) LES 3 De programma s die we in Les 1 en Les 2 gezien hebben, zagen er niet erg mooi uit. In deze les gaan we er onder andere naar kijken, hoe we de programma

Nadere informatie

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise

TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise TaskCentre Web Service Connector: Creëren van requests in Synergy Enterprise Inhoudsopgave 1. Voorbereiding... 4 2. Web Service Connector tool configuratie... 5 3. TaskCentre taak voor het aanmaken van

Nadere informatie

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS) LES 4 In deze les gaan we een eenvoudig dobbelspelletje maken: Allereerst krijgt de speler de gelegenheid zijn/haar naam in te vullen en daarna op OK te klikken

Nadere informatie

Scratch voor mobiel: AppInventor

Scratch voor mobiel: AppInventor Scratch voor mobiel: AppInventor Beginnen AppInventor is Scratch voor Android. Je maakt hiermee apps voor op je mobiele telefoon of tablet. Beginnen: Start chrome.exe en ga naar http://appinventor.mit.edu/explore

Nadere informatie

Leeftijdcheck (NL) Age Check (EN)

Leeftijdcheck (NL) Age Check (EN) Leeftijdcheck (NL) Age Check (EN) [Type text] NL: Verkoopt u producten die niet aan jonge bezoekers verkocht mogen worden of heeft uw webwinkel andere (wettige) toelatingscriteria? De Webshophelpers.nl

Nadere informatie

1. Voor het installeren wordt geadviseerd een backup te maken van uw database en bestanden.

1. Voor het installeren wordt geadviseerd een backup te maken van uw database en bestanden. NL: KiyOh.nl gebruikers kunnen met deze plug in automatisch klantbeoordelingen verzamelen, publiceren en delen in social media. Wanneer een klant een bestelling heeft gemaakt in uw Magento Shop, wordt

Nadere informatie

IMP Uitwerking week 13

IMP Uitwerking week 13 IMP Uitwerking week 13 Opgave 1 Nee. Anders moet bijvoorbeeld een venster applicatie een subklasse zijn van zowel Frame en WindowListener. Als de applicatie ook een button of een menu heeft, dan moet het

Nadere informatie

2.ouderbeleid.3.plaatsingsprocedure werk admini Pagina 1 van 14

2.ouderbeleid.3.plaatsingsprocedure werk admini Pagina 1 van 14 2.ouderbeleid.3.plaatsingsprocedure werk admini Pagina 1 van 14 In deze werkinstructies kan alles vinden wat te maken heeft met het onderhoud van het kdadmin programma. Je kunt deze onderdelen vinden in

Nadere informatie

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, 13.30 15.30 uur 1. deze opgave telt voor 30% van het totaal. Schrijf een compleet programma, dat door de gebruiker vanaf

Nadere informatie

Aanvullende toets Mobiel programmeren - versie 1 Woensdag 23 maart 2016, uur

Aanvullende toets Mobiel programmeren - versie 1 Woensdag 23 maart 2016, uur Aanvullende toets Mobiel programmeren - versie 1 Woensdag 23 maart 2016, 13.30-15.30 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde

Nadere informatie

DALISOFT. 33. Configuring DALI ballasts with the TDS20620V2 DALI Tool. Connect the TDS20620V2. Start DALISOFT

DALISOFT. 33. Configuring DALI ballasts with the TDS20620V2 DALI Tool. Connect the TDS20620V2. Start DALISOFT TELETASK Handbook Multiple DoIP Central units DALISOFT 33. Configuring DALI ballasts with the TDS20620V2 DALI Tool Connect the TDS20620V2 If there is a TDS13620 connected to the DALI-bus, remove it first.

Nadere informatie

http://www.liacs.nl/home/kosters/java/

http://www.liacs.nl/home/kosters/java/ sheets Programmeren 1 Java college 2, Walter Kosters De sheets zijn gebaseerd op de hoofdstukken 2 tot en met 6 van: D. Bell en M. Parr, Java voor studenten, Prentice Hall, 2002 http://www.liacs.nl/home/kosters/java/

Nadere informatie

Handleiding Zuludesk Parent

Handleiding Zuludesk Parent Handleiding Zuludesk Parent Handleiding Zuludesk Parent Met Zuludesk Parent kunt u buiten schooltijden de ipad van uw kind beheren. Hieronder vind u een korte handleiding met de mogelijkheden. Gebruik

Nadere informatie

wat is er nodig om een ISensorEventListener te zijn?

wat is er nodig om een ISensorEventListener te zijn? Interface In de library interface ISensorEventListener { public void OnSensorChanged(SensorEvent s); public void OnAccuracyChanged(SensorEvent s); In je eigen programma class KompasView : View, ISensorEventListener

Nadere informatie

Handleiding Installatie ADS

Handleiding Installatie ADS Handleiding Installatie ADS Versie: 1.0 Versiedatum: 19-03-2014 Inleiding Deze handleiding helpt u met de installatie van Advantage Database Server. Zorg ervoor dat u bij de aanvang van de installatie

Nadere informatie

Deel 1 : Gesloten Boek

Deel 1 : Gesloten Boek Naam : EXAMEN SOFTWAREONTWIKKELING 1STE PROEF BURG. IR. COMPUTERWETENSCHAPPEN EERSTE EXAMENPERIODE ACADEMIEJAAR 2004-2005 Deel 1 : Gesloten Boek 1. Testen Geef een overzicht van de verschillende testen

Nadere informatie

Zelftest Programmeren in Java

Zelftest Programmeren in Java Zelftest Programmeren in Java Document: n0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST PROGRAMMEREN IN JAVA Deze test

Nadere informatie

ICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers

ICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers ICARUS Illumina E653BK on Windows 8 (upgraded) how to install USB drivers English Instructions Windows 8 out-of-the-box supports the ICARUS Illumina (E653) e-reader. However, when users upgrade their Windows

Nadere informatie

HET WORDPRESS ZONDER GEDOE STUDIEPAKKET

HET WORDPRESS ZONDER GEDOE STUDIEPAKKET X Theme portfolio HET WORDPRESS ZONDER GEDOE STUDIEPAKKET De Instructie E-Books om zonder gedoe zelf je WordPress website te maken INHOUD P 1 X Theme portfolio P 2 Portfolio Categorieën P 3 Portfolio Tags

Nadere informatie

Goede bedoelingen. Hoofdstuk 8. 8.1 Een App met meerdere activiteiten. 8.2 Dialogen

Goede bedoelingen. Hoofdstuk 8. 8.1 Een App met meerdere activiteiten. 8.2 Dialogen 103 Hoofdstuk 8 Goede bedoelingen 8.1 Een App met meerdere activiteiten Activity en View Tot nu toe bestonden onze apps uit één (subklasse van) Activity, die in zijn content view gegevens aan de gebruiker

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 11 december 2015 Ingebouwde datastructuren Meer boomstructuren Access specifiers Gebruikersinvoer Codestijl Packages SAT-solver Ingebouwde datastructuren Ingebouwde

Nadere informatie

Veel gestelde vragen nieuwe webloginpagina

Veel gestelde vragen nieuwe webloginpagina Veel gestelde vragen nieuwe webloginpagina Op deze pagina treft u een aantal veel gestelde vragen aan over het opstarten van de nieuwe webloginpagina http://weblogin.tudelft.nl: 1. Ik krijg de melding

Nadere informatie

Settings for the C100BRS4 MAC Address Spoofing with cable Internet.

Settings for the C100BRS4 MAC Address Spoofing with cable Internet. Settings for the C100BRS4 MAC Address Spoofing with cable Internet. General: Please use the latest firmware for the router. The firmware is available on http://www.conceptronic.net! Use Firmware version

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 9 december 2015 Foreach String arrays Boomstructuren Interfaces Ingebouwde datastructuren Quiz Foreach Foreach Speciale versie van for om iets voor alle elementen

Nadere informatie

EM7680 Firmware Update by OTA

EM7680 Firmware Update by OTA EM7680 Firmware Update by OTA 2 NEDERLANDS/ENGLISH EM7680 Firmware update by OTA Table of contents 1.0 (NL) Introductie... 3 2.0 (NL) Firmware installeren... 3 3.0 (NL) Release notes:... 3 4.0 (NL) Overige

Nadere informatie

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double. Algemeen C# Variabele Een variabele is een willekeurige waarde die word opgeslagen. Een variabele heeft altijd een datetype ( De soort waarde die een variabele bevat). Datatypes Een datatype is de sort

Nadere informatie

Activant Prophet 21. Prophet 21 Version 12.0 Upgrade Information

Activant Prophet 21. Prophet 21 Version 12.0 Upgrade Information Activant Prophet 21 Prophet 21 Version 12.0 Upgrade Information This class is designed for Customers interested in upgrading to version 12.0 IT staff responsible for the managing of the Prophet 21 system

Nadere informatie

CMS Instructiegids Copyright Endless webdesign v.o.f

CMS Instructiegids Copyright Endless webdesign v.o.f CMS Instructiegids Copyright Endless webdesign v.o.f. 2014 1 2 Notities Inhouds opgave Hoe log ik in? 4 Een pagina toevoegen. 5 Een pagina vullen/aanpassen. 7 Een pagina verwijderen. 8 Een sjabloon kiezen.

Nadere informatie

Y.S. Lubbers en W. Witvoet

Y.S. Lubbers en W. Witvoet WEBDESIGN Eigen Site Evaluatie door: Y.S. Lubbers en W. Witvoet 1 Summary Summary Prefix 1. Content en structuur gescheiden houden 2. Grammaticaal correcte en beschrijvende markup 3. Kopregels 4. Client-

Nadere informatie

Ingebouwde klassen & methodes

Ingebouwde klassen & methodes Ingebouwde klassen & methodes Statische methodes Methodes die bij een klasse horen ipv. bij een object public class Docent { public static Docent departementshoofd() { return new Docent("Jan Ivens"); private

Nadere informatie

Hoe te verbinden met NDI Remote Office (NDIRO): Apple OS X How to connect to NDI Remote Office (NDIRO): Apple OS X

Hoe te verbinden met NDI Remote Office (NDIRO): Apple OS X How to connect to NDI Remote Office (NDIRO): Apple OS X Handleiding/Manual Hoe te verbinden met (NDIRO): Apple OS X How to connect to (NDIRO): Apple OS X Inhoudsopgave / Table of Contents 1 Verbinden met het gebruik van Apple OS X (Nederlands)... 3 2 Connect

Nadere informatie

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is PROEF-Tentamen Inleiding programmeren (IN1608WI), X januari 2010, 9.00-11.00, Technische Universiteit Delft, Faculteit EWI, Afdeling 2. Open boek tentamen: bij het tentamen mag alleen gebruik worden gemaakt

Nadere informatie

Een eerste applicatie

Een eerste applicatie Een eerste applicatie 2.1 Inleiding Programmeren in Visual Basic.NET doe je niet alleen door regels met code te schrijven. Je begint met het ontwerpen van een venster in de design mode met allerlei controls,

Nadere informatie

WebSite Director Gebruikersgids

WebSite Director Gebruikersgids WebSite Director Gebruikersgids CyberTeams, Inc. 104 South Main Street, Mt. Airy, MD 21771 301-829-6144! www.cyberteams.com CyberTeams and WebSite Director are registered trademarks of CyberTeams, Inc.

Nadere informatie

ALGORITMIEK: answers exercise class 7

ALGORITMIEK: answers exercise class 7 Problem 1. See slides 2 4 of lecture 8. Problem 2. See slides 4 6 of lecture 8. ALGORITMIEK: answers exercise class 7 Problem 5. a. Als we twee negatieve (< 0) getallen bij elkaar optellen is het antwoord

Nadere informatie

ATOS Viewer for Dental Frameworks User Manual

ATOS Viewer for Dental Frameworks User Manual ATOS Viewer for Dental Frameworks User Manual www.dentwise.eu Inhoud Content NEDERLANDS... 2 1. Installatie... 2 2. Algemene Functies... 2 3. Afstanden Meten... 3 4. Doorsneden Maken... 4 5. Weergave Aanpassen...

Nadere informatie

CMS Instructiegids Copyright Endless webdesign v.o.f

CMS Instructiegids Copyright Endless webdesign v.o.f CMS Instructiegids Copyright Endless webdesign v.o.f. 2017 1 Inhouds opgave 1. Hoe log ik in? Inloggen in het CMS systeem is heel simpel! Hoe log ik in? Een pagina toevoegen. Een pagina vullen/aanpassen.

Nadere informatie

APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN. Onderdeel van SmartProducts

APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN. Onderdeel van SmartProducts APPLICATIEBOUW 3E COLLEGE: OBJECT GEORIËNTEERD PROGRAMMEREN, METHODEN, PARAMETERS, SCOPE VAN VARIABELEN Onderdeel van SmartProducts INHOUD COLLEGE 3 Scope van variabelen {3.9} Class ontwerpen en maken,

Nadere informatie

Javascript oefenblad 1

Javascript oefenblad 1 Leer de basis van Javascript. Javascript oefenblad 1 Niels van Velzen Javascript oefenblad 1 Pagina 2 Inleiding Javascript is niet altijd even makkelijk. Vooral aan het begin is het even wennen hoe de

Nadere informatie

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: Eenvoudig voorbeeld. Er wordt verondersteld dat er met VS 2008 EXPRESS gewerkt wordt. Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel: (Sommige schermafdrukken zijn afkomstig

Nadere informatie

Handleiding voor Zotero versie 2.0

Handleiding voor Zotero versie 2.0 Handleiding voor Zotero versie 2.0 Michiel Wolda De handleiding voor Zetero is geschreven voor de lezers van het boek Deskresearch: Informatie selecteren, beoordelen en verwerken: tweede editie (Van Veen

Nadere informatie

Contents. Introduction Problem Definition The Application Co-operation operation and User friendliness Design Implementation

Contents. Introduction Problem Definition The Application Co-operation operation and User friendliness Design Implementation TeleBank Contents Introduction Problem Definition The Application Co-operation operation and User friendliness Design Implementation Introduction - TeleBank Automatic bank services Initiates a Dialog with

Nadere informatie

Interaction Design for the Semantic Web

Interaction Design for the Semantic Web Interaction Design for the Semantic Web Lynda Hardman http://www.cwi.nl/~lynda/courses/usi08/ CWI, Semantic Media Interfaces Presentation of Google results: text 2 1 Presentation of Google results: image

Nadere informatie

EM6250 Firmware update V030507

EM6250 Firmware update V030507 EM6250 Firmware update V030507 EM6250 Firmware update 2 NEDERLANDS/ENGLISH Table of contents 1.0 (NL) Introductie... 3 2.0 (NL) Firmware installeren... 3 3.0 (NL) Release notes:... 5 1.0 (UK) Introduction...

Nadere informatie

Het handboek van KDE Screen Ruler. Lauri Watts Vertaling van het handboek: Niels Reedijk Vertaler/Nalezer: Alexander S. Koning

Het handboek van KDE Screen Ruler. Lauri Watts Vertaling van het handboek: Niels Reedijk Vertaler/Nalezer: Alexander S. Koning Lauri Watts Vertaling van het handboek: Niels Reedijk Vertaler/Nalezer: Alexander S. Koning 2 Inhoudsopgave 1 Inleiding 5 2 Menubeschrijvingen 6 3 Dankbetuigingen en licentie 8 Samenvatting KDE Screen

Nadere informatie

Ga naar http://www.domeinnaam.nl/wp-admin en log in met de gebruikersnaam en wachtwoord verkregen via mail.

Ga naar http://www.domeinnaam.nl/wp-admin en log in met de gebruikersnaam en wachtwoord verkregen via mail. INLOGGEN Ga naar http://www.domeinnaam.nl/wp-admin en log in met de gebruikersnaam en wachtwoord verkregen via mail. Vul hier je gebruikersnaam en wachtwoord in en klik op Inloggen. Bij succesvolle login

Nadere informatie

Inloggen. In samenwerking met Stijn Berben.

Inloggen. In samenwerking met Stijn Berben. Inloggen Ga naar www.hetjongleren.eu. Heb je al een gebruikersnaam en wachtwoord, log dan in op deze pagina (klik op deze link ): Vul hier je gebruikersnaam en wachtwoord in en klik op Inloggen. Bij succesvolle

Nadere informatie

Tentamen Objectgeorienteerd Programmeren

Tentamen Objectgeorienteerd Programmeren Tentamen Objectgeorienteerd Programmeren 5082IMOP6Y maandag 16 november 2015 13:00 15:00 Schrijf je naam en studentnummer op de regel hieronder. Sla deze pagina niet om tot de surveillant vertelt dat het

Nadere informatie

NSPYRE LEGO MINDSTORMS UITDAGING (JAVA) INLEIDING. DOEL: SIMULATOR:

NSPYRE LEGO MINDSTORMS UITDAGING (JAVA) INLEIDING. DOEL: SIMULATOR: NSPYRE LEGO MINDSTORMS UITDAGING (JAVA) INLEIDING. Door mee te doen aan deze uitdaging kan je Nspyre laten zien wat je kan. Schrijf jij de beste oplossing dan is deze lego mindstorms nxt 2.0 set voor jou.

Nadere informatie

ContentSearch. Deep dive

ContentSearch. Deep dive ContentSearch Deep dive 2 Waarvoor in te zetten? Alternatief voor database queries Waar performance een issue kan zijn Daadwerkelijk frontend Site Search Mogelijk niet de beste optie maar wel goedkoop

Nadere informatie

Activity. Bij het starten van een app: Operating system maakt een Activity -object aan. en neemt dat onderhanden met de methode OnCreate( )

Activity. Bij het starten van een app: Operating system maakt een Activity -object aan. en neemt dat onderhanden met de methode OnCreate( ) Activity Bij het starten van een app: Operating system maakt een Activity -object aan en neemt dat onderhanden met de methode OnCreate( ) Klasse uit library Android.App Methode uit klasse Activity eigen

Nadere informatie

Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Digitale

Nadere informatie

Intent. Intent: bedoeling om een nieuwe activiteit te starten. eigen activiteit. standard. Hallo Teller. web-browser text-sender

Intent. Intent: bedoeling om een nieuwe activiteit te starten. eigen activiteit. standard. Hallo Teller. web-browser text-sender Multi Intent Intent: bedoeling om een nieuwe activiteit te starten eigen activiteit Hallo Teller standard web-browser text-sender Intent: Hallo opstarten public class Multi : Activity Button b1, b2, b3,

Nadere informatie

Een website maken met databasetoegang.

Een website maken met databasetoegang. Hoofdstuk 5 Een website maken met databasetoegang. In dit hoofdstuk gaan we het weblog dat je in hoofdstuk 4 hebt gemaakt verder uitbreiden. Een belangrijk onderdeel wordt toegevoegd aan de applicatie,

Nadere informatie

Om het Elektronica thema te installeren gaat u naar "Theme Store" in Design. Hier kunt u het Elektronica thema in 4 kleurvarianten vinden.

Om het Elektronica thema te installeren gaat u naar Theme Store in Design. Hier kunt u het Elektronica thema in 4 kleurvarianten vinden. Inhoud: 1. Installatie 2. FAQ 3. Thema instellingen 4. Meer hulp nodig? 1.Installatie: Om het Elektronica thema te installeren gaat u naar "Theme Store" in Design. Hier kunt u het Elektronica thema in

Nadere informatie

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak); Vaknaam: Programmeren I (Java) - Tentamen Module: 2 Datum/Tijd: 17 mrt 2015 / 18.30 20:30 Richting: ICT Code: IC011 Docent: E. Lieuw Boeken en aantekeningen NIET toegestaan. Kladpapier is wel toegestaan.

Nadere informatie

Documentatie Nederlands v1

Documentatie Nederlands v1 Documentatie Nederlands v1 Getting started Navigation menu Theme settings General Features Background Typography Banners Contact details Social Unique selling points Image Sizes Frequently asked questions

Nadere informatie

Hippo-handleiding Homepage Inhoudsopgave

Hippo-handleiding Homepage Inhoudsopgave Hippo-handleiding Homepage Inhoudsopgave Homepage... 2 Onderdelen Homepage... 3 Homepage header aanmaken... 4 Header koppelen aan de homepage (home)... 9 Oud nieuws vervangen op de homepage (home)... 11

Nadere informatie

Handleiding wordpress

Handleiding wordpress Handleiding wordpress Wordpress versie 3.0.4 Handleiding versie 1.1 Auteur Website Geert Hoekzema www.geerthoekzema.nl www.geerthoekzema.nl geert@geerthoekzema.nl 1 Inhoudsopgave Inleiding... 3 Beginnen

Nadere informatie

Document. Name: Systemhound 2007 Getting started guide. Created: Roel van Baaren Raxco Software 7 April Revisions:

Document. Name: Systemhound 2007 Getting started guide. Created: Roel van Baaren Raxco Software 7 April Revisions: Document Name: Systemhound 2007 Getting started guide Created: Author Date Roel van Baaren Raxco Software 7 April 2008 Revisions: Author Date 1 Index Index... 2 Installatie van Systemhound 2007 server...

Nadere informatie

MyDHL+ Tarief berekenen

MyDHL+ Tarief berekenen MyDHL+ Tarief berekenen Bereken tarief in MyDHL+ In MyDHL+ kunt u met Bereken tarief heel eenvoudig en snel opvragen welke producten er mogelijk zijn voor een bestemming. Ook ziet u hierbij het geschatte

Nadere informatie

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Kwis (3) class X { public void a() { System.out.println(x); public static void main(string[] args) { X x = new X(); Kwis (3) class X { public void a() { System.out.println("x"); class Y extends X { public void a() { System.out.println("y"); class Z extends Y { public void a() { System.out.println("z"); public static

Nadere informatie

CBSOData Documentation

CBSOData Documentation CBSOData Documentation Release 1.0 Jonathan de Bruin Dec 02, 2018 Contents 1 Statistics Netherlands opendata API client for Python 3 1.1 Installation................................................ 3

Nadere informatie

Programmeren in Java 3

Programmeren in Java 3 7 maart 2010 Deze les Zelf componenten maken Concurrency (multithreading): werken met threads levenscyclus van een thread starten tijdelijk onderbreken wachten stoppen Zelf componenten maken Je eigen component:

Nadere informatie

1. Document Management

1. Document Management 1. Document Management 1.1. Revision Manager Revision Manager is een gescheiden module waarin het aanmaken van afgeleide documenten en het onderhouden van revisies moet gebeuren om de aanwezige Links te

Nadere informatie

Data Handling Ron van Lammeren - Wageningen UR

Data Handling Ron van Lammeren - Wageningen UR Data Handling 1 2010-2011 Ron van Lammeren - Wageningen UR Can I answer my scientific questions? Geo-data cycle Data handling / introduction classes of data handling data action models (ISAC) Queries (data

Nadere informatie