Springen naar inhoud


Tutorial: Oefening 2 => Onderwerpen Intent / Parcelable

Android intent parcelable object Android Studio tutorial

  • Log in a.u.b. om te beantwoorden
Geen reacties in dit onderwerp

#1 Prior

Prior

    Rookie Developer

  • Leden
  • Pip
  • 34 berichten
    Laatst bezocht 26 sep 2017 19:33

Geplaatst op 15 juli 2017 - 21:21

1) Maak een nieuw project aan, met als projectnaam 'VBIB_Oefening2' aan, company domain en project locatie kies je dus zelf.
Het api level is 19 (KitKat) oftewel Android 4.4
De naam van je Activity is 'HoofdActivity'.

2) Volg desnoods tutorial oefening 1, om onderstaand gewenst resultaat te krijgen.

Bijlage  start.png   9,29K   1 downloads

3) Ga nu naar de file 'strings.xml' in het mapje 'res/values'

Hier staan 3 regels.  Als u een regel kopieert en plakt, dan krijgt u een rode lijn als foutmelding want er kan maar één unieke waarde bij het attribuut 'name' staan bij een <string>-tag staan.

Zorg voor het onderstaande (kopiëren en plakken) :

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">VBIB_Oefening2</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>

<string name="ga_naar_2">Ga naar Activity 2</string>
<string name="ga_naar_1">Ga naar Activity 1</string>

<string name="naam">Naam :</string>
<string name="leeftijd">Leeftijd :</string>

<string name="event">Event :</string>
<string name="locatie">Locatie :</string>
<string name="categorie">Categorie :</string>

<string name="tekst">tekst</string>

</resources>

4) Rechtsklik op de packagenaam in het mapje 'app/src/main/java/'.  Kies New, Activity, Blank Activity en een venster komt tevoorschijn om een activity aan te maken.
Geef het de naam 'TweedeActivity'. Een nieuwe activity wordt aangemaakt met zijn eigen layout en menu.

5) Ga nu naar 'Text' modus (rechtse tabblad) van 'activity_hoofd'.  

De unieke string waarde van het attribuut 'name' kan u hieronder gekoppeld zien aan een android:text in een willekeurige tag.  Hier kan u meerdere keren indien gewenst dezelfde string waarde gebruiken.
Indien u ooit uw applicatie aanpast, dan moet u enkel de string waarden aanpassen binnen het mapje 'res/values' om uw schermen met tekstwaarden éénmalig aan te passen.

Verwijder alles en plaats het volgende (kopiëren en plakken) :

<RelativeLayout xmlns:android="http://schemas.andro...pk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".HoofdActivity">

<Button
android:id="@+id/btnGaNaar2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ga_naar_2" />

<TableLayout
android:layout_below="@id/btnGaNaar2"
android:layout_marginTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/event"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tekst"
android:layout_marginLeft="25dp"
android:id="@+id/tvEvent"
/>
</TableRow>

<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/locatie"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tekst"
android:layout_marginLeft="25dp"
android:id="@+id/tvLocatie"
/>
</TableRow>

<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/categorie"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tekst"
android:layout_marginLeft="25dp"
android:id="@+id/tvCategorie"
/>
</TableRow>

<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/prijs"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tekst"
android:layout_marginLeft="25dp"
android:id="@+id/tvPrijs"
/>
</TableRow>

</TableLayout>

</RelativeLayout>

Bij het typen van dergelijke UI-componenten zoals buttons, textviews, etcera .. en hun attributen, dan volstaat het om een paar karakters in te te typen en Intellisense te laten werken.
Intellisense zal u ook misschien een aantal waarden automatisch toereiken voor bij de attributen zoals 'match_parent' of 'wrap_content', etcera ...

6) Ga naar 'Text' modus (rechtse tabblad) van 'layout_tweede'.
Verwijder alles en plaats het volgende (kopiëren en plakken) :
Hou rekening bij het maken van nieuwe Activities dat u uw tools:context juist configureerd met uw eigen packagenaam.

 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="be.davygevaert.vbib_oefening2.TweedeActivity">

android:id="@+id/btnGaNaar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ga_naar_1" />

android:layout_below="@id/btnGaNaar1"
android:layout_marginTop="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">


android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/naam"
/>

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tekst"
android:layout_marginLeft="25dp"
android:id="@+id/tvNaam"
/>

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/leeftijd"
/>

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tekst"
android:layout_marginLeft="25dp"
android:id="@+id/tvLeeftijd"
/>

7) Sluit alles, behalve HoofdActivity waar er Java-code kan geschreven worden.

Om vanuit HoofdActivity naar TweedeActivity te kunnen gaan en omgekeerd moet er in elke activity een Intent komen te staan.  Hier zal dit staan in een onclicklistener van een Button.
Met een Intent kunnen we specifiëren welke Activity, indien meerdere in project aanwezig, geladen moet worden als de eindgebruiker op een knop klikt.

Ook kunnen we waarden meegeven met putExtra.

bv:

intent.putExtra(String name, String value)
intent.putExtra(String name, int value)
etcetera ...

Bij 'name' geven we een waarde mee zodat we een referentie kunnen maken binnen de applicatie naar het geheugen van de intent, waar een waarde 'value' gestockeerd zit en zodat we deze kunnen opvragen in de volgende Activity.

Plaats het volgende:

Java Code:

import android.app.Activity;
import android.content.Intent;
import android.widget.Button;

public class HoofdActivity extends Activity {

private String naam;
private int leeftijd;
private Intent intent;
private Button btnKnopGaNaar2;

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

naam = "Davy Gevaert";
leeftijd = 35;

btnKnopGaNaar2 = (Button) findViewById(R.id.btnGaNaar2);

btnKnopGaNaar2.setonclickListener(new View.onclickListener() {
@Override
public void onclick(View view) {
// met een intent kunnen we een nieuwe willekeurige Activity op het scherm van de smartphone weergeven
// hierbij zal TweedeActivity geladen worden
intent = new Intent(HoofdActivity.this, TweedeActivity.class);

// aan een intent kunnen we ook waarden meegeven
intent.putExtra("naam", naam);
intent.putExtra("leeftijd", leeftijd);

startActivity(intent);
}
});
}


8) Ga naar 'TweedeActivity' waar er Java-code kan geschreven worden.

Hier vangen we de waarden op van 'HoofdActivity' en tonen de opgevangen waarden op het scherm.

Plaats het volgende:

Java Code:
public class TweedeActivity extends Activity {

private String naam;
private int leeftijd;
private TextView tvNaam;
private TextView tvLeeftijd;
private Button btnGaNaar1;
private Intent intent;

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

tvNaam = (TextView) findViewById(R.id.tvNaam);
tvLeeftijd = (TextView) findViewById(R.id.tvLeeftijd);

naam = getIntent().getStringExtra("naam");
leeftijd = getIntent().getIntExtra("leeftijd", leeftijd);

tvNaam.setText(naam);
tvLeeftijd.setText(leeftijd + " jaar");

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

btnGaNaar1.setonclickListener(new View.onclickListener() {
@Override
public void onclick(View view) {

}
});
}

Om nu van 'TweedeActivity' naar 'HoofdActivity' te gaan en een eigen object door te geven met willekeurige waarden met behulp van een intent :

intent.putExtra(String name, Parcelable value);

Dan moet u uw klasse implementeren als Parcelable, alsook aanliggende klasses binnenin de hoofdklasse.
Parcelable in Android is een vorm van Serialisation (Serializable) maar veel sneller.

Laten we eerst een paar eigen klasses creeëren, elk met hun eigen Parcelable implementatie. (wat niet zoveel verschilt):

9) Rechtsklik op je packagenaam vanuit 'app/src/main/java/' en kies New, New Package en typ 'model' in.

Rechtsklik op package 'model' en kies New, Java Class en geef het de naam Event.

Typ :

Java Code:
import android.os.Parcelable;

public class Event implements Parcelable {

private String naam;

public Event(){
// empty constructor
}


Een lege constructor plaats je best zelf aangezien je dit niet kan genereren.

Rechtsklik na de accolade en kies Generate, Getter and setter.
Kies de enigste optie String naam en klik op 'OK'.

Automatisch wordt een getter en setter aangemaakt.
Je kan de constructor/getter en setter dit dichtklappen door op het '-' teken links ervan te klikken, om plaats te winnen of je code overzichtelijker te maken.

Rechtsklik en kies Generate, override methodes.  Kies de 2 methodes 'describeContents' en 'writeToParcel' van de implementatie Parcelable, en klik op OK.

Ook moet je zelf een custom constructor aanmaken voor je Parcel opdat je waarden overgebracht kunnen worden naar de Activity die je wenst. Daarnaast moet je ook nog een eigen Creator aanmaken.

Omdat dit als beginner een beetje te moeilijk zal worden, plaats ik de code hieronder van het volledig model:

Event :

Java Code:
import android.os.Parcel;
import android.os.Parcelable;

public class Event implements Parcelable {
private String naam;
private int prijs;
private Locatie locatie;
private Categorie categorie;

public Event(){
// empty constructor
}

public String getNaam() {
return naam;
}

public void setNaam(String naam) {
this.naam = naam;
}

public int getPrijs() {
return prijs;
}

public void setPrijs(int prijs) {
this.prijs = prijs;
}

public Locatie getLocatie() {
return locatie;
}

public void setLocatie(Locatie locatie) {
this.locatie = locatie;
}

public Categorie getCategorie() {
return categorie;
}

public void setCategorie(Categorie categorie) {
this.categorie = categorie;
}

public Event(Parcel in) {
naam = in.readString();
prijs = in.readInt();
locatie = in.readParcelable(Locatie.class.getClassLoader());
categorie = in.readParcelable(Categorie.class.getClassLoader());
}

public static final Creator<Event> CREATOR =
new Creator<Event>() {
@Override
public Event createFromParcel(Parcel pc) {
return new Event(pc);
}

@Override
public Event[] newArray(int size) {
return new Event[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(naam);
dest.writeInt(prijs);
dest.writeParcelable(locatie, flags);
dest.writeParcelable(categorie, flags);
}
}


Locatie :

Java Code:
import android.os.Parcel;
import android.os.Parcelable;

public class Locatie implements Parcelable {
private String locatieNaam;

public Locatie() {
// lege constructor
}

public String getLocatieNaam() {
return locatieNaam;
}

public void setLocatieNaam(String locatieNaam) {
this.locatieNaam = locatieNaam;
}

public Locatie(Parcel in) {
locatieNaam = in.readString();
}

public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
@Override
public Locatie createFromParcel(Parcel pc) {
return new Locatie(pc);
}

@Override
public Locatie[] newArray(int size) {
return new Locatie[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(locatieNaam);
}
}

Categorie :

Java Code:
import android.os.Parcel;
import android.os.Parcelable;

public class Categorie implements Parcelable {
private String categorieNaam;

public Categorie(){
// lege constructor
}

public String getCategorieNaam() {
return categorieNaam;
}

public void setCategorieNaam(String categorieNaam) {
this.categorieNaam = categorieNaam;
}

public Categorie(Parcel in) {
categorieNaam = in.readString();
}

public static final Parcelable.Creator CREATOR =
new Parcelable.Creator() {
@Override
public Categorie createFromParcel(Parcel pc) {
return new Categorie(pc);
}

@Override
public Categorie[] newArray(int size) {
return new Categorie[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(categorieNaam);
}
}

10) Nu we met ons model klaar zijn met een Parcelable-implementatie, gaan we nu de button onclicklistener verder aanvullen in 'TweedeActivity', zijnde:

Java Code:
btnGaNaar1.setonclickListener(new View.onclickListener() {
@Override
public void onclick(View view) {

Event event = new Event();
event.setNaam("Feesten als de beesten");
event.setPrijs(5);

Categorie categorie = new Categorie();
categorie.setCategorieNaam("Fuiven");

Locatie locatie = new Locatie();
locatie.setLocatieNaam("Vlasmarkt");

event.setCategorie(categorie);
event.setLocatie(locatie);

intent = new Intent(TweedeActivity.this, HoofdActivity.class);
intent.putExtra("object_event", event);

startActivity(intent);

}
});

11) Verander de code van 'HoofdActivity' naar :

Java Code:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import be.davygevaert.vbib_oefening2.model.Event;

public class HoofdActivity extends Activity {

private String naam;
private int leeftijd;
private Intent intent;
private Button btnKnopGaNaar2;

private TextView tvEvent, tvLocatie, tvCategorie, tvPrijs;
private Event event;

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

naam = "Davy Gevaert";
leeftijd = 35;

tvEvent = (TextView) findViewById(R.id.tvEvent);
tvLocatie = (TextView) findViewById(R.id.tvLocatie);
tvCategorie = (TextView) findViewById(R.id.tvCategorie);
tvPrijs = (TextView) findViewById(R.id.tvPrijs);

event = getIntent().getParcelableExtra("object_event");

if (event != null) {
tvEvent.setText(event.getNaam());
tvLocatie.setText(event.getLocatie().getLocatieNaam());
tvCategorie.setText(event.getCategorie().getCategorieNaam());
tvPrijs.setText(Integer.toString(event.getPrijs()));
} else {
// doe niets indien null object Event
}

btnKnopGaNaar2 = (Button) findViewById(R.id.btnGaNaar2);

btnKnopGaNaar2.setonclickListener(new View.onclickListener() {
@Override
public void onclick(View view) {
// met een intent kunnen we een nieuwe willekeurige Activity op het scherm van de smartphone weergeven
// hierbij zal TweedeActivity geladen worden
intent = new Intent(HoofdActivity.this, TweedeActivity.class);

// aan een intent kunnen we ook waarden meegeven
intent.putExtra("naam", naam);
intent.putExtra("leeftijd", leeftijd);

startActivity(intent);
}
});
}


Resultaat schermen :

Bijlage  resultaat1.png   113,3K   1 downloads Bijlage  resultaat2.png   96,6K   2 downloads





Ook met taq Android, intent, parcelable, object, Android Studio, tutorial voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


Untitled 1

Met dank aan PascalBianca die tot op heden alles bijhoud sinds anno dec 2010)
Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
vbib.be - vbnet.be - vbdotnet.be - visualbasic.be