android Spinner funktioniert nicht

Dieses Thema android Spinner funktioniert nicht im Forum "Mobile Geräte" wurde erstellt von Joob, 28. Nov. 2016.

Thema: android Spinner funktioniert nicht Mein Spinner zeigt zwar die WerteListe als DropDown an aber weder werden die Werte in den Textteil geschreiben noch...

  1. Mein Spinner zeigt zwar die WerteListe als DropDown an aber weder werden die Werte in den Textteil geschreiben noch wird der Listener OnSelectedItem funktioniert nicht mehr.

    Ich bekomme keine Fehler, und habe keine Ahnung wo ich das anfassen soll !

    Code (Text):
    public ArrayList<A2100_spin_groups_fields> a2100_spin_groups_array = new ArrayList<A2100_spin_groups_fields>();
        A2100_spin_groups_fields_adapter spinGroupAdapter;

        TextView TFIDMember;
        EditText TFMemberName;
        CheckBox CBMemberAktiv;
        Spinner SPMemberGroup;

        String MemberID;
        String MemberName;
        String MemberAktiv;
        String MemberGroup;

        @Override
        protected void onCreate(Bundle savedInstanceState) {

            boolean varAktiv;

            super.onCreate(savedInstanceState);
            setContentView(R.layout.a2100_member_change);

            String method = "SPI";
            A2100_member_change.BGT2100 BGT2100 = new A2100_member_change.BGT2100(this);
            BGT2100.execute(method, MemberID, MemberName, MemberAktiv, MemberGroup);

            // Resources passed to adapter to get image
            Resources res = getResources();

            TFIDMember = (TextView) findViewById(R.id.A2100_IDMember);
            TFMemberName = (EditText) findViewById(R.id.A2100_MemberName);
            CBMemberAktiv = (CheckBox) findViewById(R.id.A2100_MemberAktiv);
            SPMemberGroup = (Spinner) findViewById(R.id.A2100_MemberGroup);

            // Create custom adapter object ( see below CustomAdapter.java )
            spinGroupAdapter = new A2100_spin_groups_fields_adapter(this, R.layout.a2100_spin_groups_rowlayout, a2100_spin_groups_array,res);

            // Set adapter to spinner
            SPMemberGroup.setAdapter(spinGroupAdapter);

            String[] TagToChange = getIntent().getExtras().getString("TagToChange").split(";");

            if(TagToChange[2].equals("0")) {varAktiv = false;} else {varAktiv = true;}

            if (TagToChange[0].equals("0"))
            {
                TFIDMember.setText(null);
                TFMemberName.setText(null);
                CBMemberAktiv.setChecked(false);
                SPMemberGroup.setSelection(0);
            } else
            {
                TFIDMember.setText(TagToChange[0]);
                TFMemberName.setText(TagToChange[1]);
                CBMemberAktiv.setChecked(varAktiv);
                SPMemberGroup.setSelection(0);
            }


            // Listener called when spinner item selected
           SPMemberGroup.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> parentview, View v, int position, long id) {

                    // Get selected row data to show on screen
                    String GroupID    = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupID)).getText().toString();
                    String GroupName = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupName)).getText().toString();

                    String OutputMsg = "Selected Group : \n\n"+GroupID+"\n"+GroupName;
                    System.out.println("Group : " + GroupID);
                    Toast.makeText(getApplicationContext(),OutputMsg, Toast.LENGTH_LONG).show();
                }

                @Override
                public void onNothingSelected(AdapterView<?> parentView) {
                    System.out.println("bin dada ");
                }

            });


        }

    upload_2016-11-28_23-43-36.png
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Ich hatte gestern ein ähnliches Problem - mit einer SeekBar. Kein Listener funktionierte. Erst nachdem ich die App von meinem Testgerät gelöscht hatte, Clean und Build erneut gemacht habe, lief es dann. Ich glaube mein Android Studio ist leicht verbuggt.
    Vielleicht hilft es Dir ja weiter.
     
  4. Wenn sich die Auswahl des Spinners ändert, dann soll sich auch der Text in den beiden TextViews ändern, richtig?
    Dann musst du das deinem Spinner / den TextViews auch mitteilen.
    Momentan holst du dir nur die Werte aus den TextViews (die immer gleich sind) und speicherst sie ab.

    Je nach dem wie dein Item des Spinners aufgebaut ist, kannst du sowas machen:
    Code (Java):

    parent.getItemAtPosition(pos).getText(); // o. ä. Funktionen
     
     
  5. an Buggy

    Hallo,

    Clean und Build habe ich schon gemacht.`Leider kein Erfolg.
    Ich würde jetzt ein neues Projekt beginnen und die Daten aus dem alten importieren. Das Manifest im aktuellen Projekt sieht auch etwas komisch aus.
    Gibts beim importieren was zu beachten ?
     
  6. an Robat

    aber was sagst du dazu das er auf den Listener nicht reagiert, dort habe ich mit System.out... geprüft. Der Listener wird nicht aktiviert.
    Ansonsten Danke, das baue ich noch ein.
     
  7. Wie komisch sieht denn dein Manifest aus?
    Wenn Du alte Daten importierst, importierst Du zwangsläufig auch alle Fehler.
    Versuche mal bitte, einen weiteren Spinner zu implementieren, und füge dem auch den Listener hinzu. Prüfe, obs bei dem funktioniert.
    Weterhin kannst Du ja mal andere Listener implementieren. So schnell würde ich die Flinte nicht ins Korn werfen.

    Edit:
    Vielleicht bin ich blind, aber müsstest Du nicht
    Code (Text):
    .setDropDownViewResource
    auf Deinen Adapter anwenden?
     
    Zuletzt bearbeitet: 30. Nov. 2016
  8. Das ist mein erstes Projekt, und ich habe da mehrfach Namen geändert dabei scheint im Manifest einiges durcheinander gekommen zu sein. Also ich hab dann heute mal alles neu gemacht, jede Activit angelegt, jede Klasse angelegt, alles per Hand angepaßt, und nun ist das was im Manifest steht auch wieder nachvollziehbar.
    Hier da du gefragt hast:
    Neu und gut:
    Code (Text):
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.traincounter.jupp.tc">

        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

        <application
            android:name=".Z_GlobalVars"
            android:allowBackup="true"
            android:icon="@mipmap/yorokobi_symbol_white"
            android:label="Yorokobi Training"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".A0000_login">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".A0100_base" />
            <activity android:name=".A1000_training_groups" />
            <activity android:name=".A2000_members" />
            <activity android:name=".A2100_member_change" />
            <activity android:name=".A3000_trainers" />
            <activity android:name=".A3100_trainer_change" />
            <activity android:name=".A4000_groups" />
            <activity android:name=".A4100_group_change" />
            <activity android:name=".A5000_report"></activity>
        </application>

    </manifest>
    alt und komisch:
    Code (Text):
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.traincounter.yorokobi.jupp.trainyorokobi"
      android:versionCode="1"
      android:versionName="1.0" >

      <uses-sdk
      android:minSdkVersion="18"
      android:targetSdkVersion="23" />

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

      <application
      android:name="com.traincounter.yorokobi.jupp.trainyorokobi.Z_GlobalVars"
      android:allowBackup="true"
      android:icon="@mipmap/yorokobi_symbol_white"
      android:label="Yorokobi Training"
      android:supportsRtl="true"
      android:theme="@style/AppTheme" >
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A0000_login" >
      <intent-filter>
      <action android:name="android.intent.action.MAIN" />

      <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      </activity>
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A1100_booking" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A2000_members" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A3000_trainers" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A4000_groups" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A5000yorokobi_report" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A0100_base" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A1000_training_groups" />
      <!--
    ATTENTION: This was auto-generated to add Google Play services to your project for
      App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information.
      -->
      <meta-data
      android:name="com.google.android.gms.version"
      android:value="@integer/google_play_services_version" />

      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A2100_member_change" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A4100_group_change" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A3100_trainer_change" />
      <activity android:name="com.traincounter.yorokobi.jupp.trainyorokobi.A0000_spin_train_fields" />
      </application>

    </manifest>
    Allerdings liegt der Fehler in dem was Ihr sagt, das werde ich morgen Abend genau kontrollieren.
     
  9. Gibts Ergebnisse, die Du mit uns teilen möchtest?
     
  10. Ich komm da nicht weiter,
    da sind aber noch andere Problem zu lösen, das mach ich erst mal und geh das ganze dann mit etwas Abstand neu an.
    Hast Du eine Idee. Ist doch komisch das nur der Texteil nicht funktioniert. Ich habe schon Stunden daran kontroliert und im Beispiell im Internet läuft das.
    Ich habe aber eine weiteres Spinner gebaut, das gleiche. Muss also definitiv ein Fehler in meinem Code sein.
     
  11. Poste mal bitte alle relevanten Codeabschnitte.
    -Also wie / wo du den Spinner initialisierst.
    - Layout Datei(en)
    - (Manifest ist eher irrelevant afaik)
    - deinen Adapter!

    Was mich ein wenig wundert ist, dass du eine ArrayList a2100_spin_groups_array deklarierst aber niemals Werte setzt. Wo genau werden denn die Werte zu der ArrayList hinzugefügt?

    Off-Topic
    Würde dir raten mehr mit LogCat zuarbeiten anstatt mit Syso :)

    Gruß
     
  12. pack dein Projekt mal zusammen als zip und auf DropBox, dann kann man sich die mal runterladen und ansehen.
     
  13. Ok, ich hab es mal angefügt und gekürzt. Das Array kommt aus einem JSON das habe ich fertig eingegeben, da ich die Daten aus einer DB im Internet abfrage.
    Ich muste ein paar Links mit http ... durch xyz ersetzen, die wollte er nicht mitnehmen.
    Ich hoffe du hast eine IDEE.

    Das Beispiel kommt aus dem Internet:
    http://androidexample.com/Custom_Sp...le/index.php?view=article_discription&aid=84#

    als Vid :

    package com.traincounter.jupp.tc;

    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.res.Resources;
    import android.os.AsyncTask;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemSelectedListener;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io_OutputStream;
    import java.io_OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.ProtocolException;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.ArrayList;

    public class A2100_member_change extends AppCompatActivity {

    public ArrayList<A2100_spin_groups_fields> a2100_spin_groups_array = new ArrayList<A2100_spin_groups_fields>();
    A2100_spin_groups_fields_adapter spinGroupAdapter;

    TextView TFIDMember;
    EditText TFMemberName;
    CheckBox CBMemberAktiv;
    Spinner SPMemberGroup;

    String MemberID;
    String MemberName;
    String MemberAktiv;
    String MemberGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

    boolean varAktiv;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.a2100_member_change);

    String method = "SPI";
    A2100_member_change.BGT2100 BGT2100 = new A2100_member_change.BGT2100(this);
    BGT2100.execute(method, MemberID, MemberName, MemberAktiv, MemberGroup);

    // Resources passed to adapter to get image
    Resources res = getResources();

    TFIDMember = (TextView) findViewById(R.id.A2100_IDMember);
    TFMemberName = (EditText) findViewById(R.id.A2100_MemberName);
    CBMemberAktiv = (CheckBox) findViewById(R.id.A2100_MemberAktiv);
    SPMemberGroup = (Spinner) findViewById(R.id.A2100_MemberGroup);

    // Create custom adapter object ( see below CustomAdapter.java )
    spinGroupAdapter = new A2100_spin_groups_fields_adapter(A2100_member_change.this, R.layout.a2100_spin_groups_rowlayout, a2100_spin_groups_array,res);

    // Set adapter to spinner
    SPMemberGroup.setAdapter(spinGroupAdapter);


    TFIDMember.setText(null);
    TFMemberName.setText(null);
    CBMemberAktiv.setChecked(false);
    SPMemberGroup.setSelection(0);


    SPMemberGroup.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
    System.out.println("getouched");
    System.out.println("WERT : " + SPMemberGroup.getPrompt());
    return false;
    }
    });

    // Listener called when spinner item selected
    SPMemberGroup.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentview, View v, int position, long id) {

    // Get selected row data to show on screen
    String GroupID = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupID)).getText().toString();
    String GroupName = ((TextView) v.findViewById(R.id.a2100spinGrp_GroupName)).getText().toString();

    String OutputMsg = "Selected Group : \n\n"+GroupID+"\n"+GroupName;
    System.out.println("Group : " + GroupID);
    Toast.makeText(getApplicationContext(),OutputMsg, Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
    System.out.println("bin dada ");
    }

    });


    }

    public void NewMember(View view)
    {

    }

    public void SetMember(View view)
    {

    }

    public void DelMember(View view)
    {


    }

    public void delTag()
    {


    }






    public class BGT2100 extends AsyncTask<String,String,String> {

    Context ctx;

    BGT2100(Context ctx)
    {
    this.ctx = ctx;
    }



    @Override
    protected void onPreExecute()
    {
    super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params)
    {


    String returnMessage = "";

    if (method.equals("SAV"))
    {


    } else if (method.equals("SPI"))
    {
    result ="{\"allgroups\":[{\"id\":\"1\",\"trainGroup\":\"Erwachsene\"},{\"id\":\"2\",\"trainGroup\":\"Kinder\"}]}";
    lstGroupsJsonObj = new JSONObject(result);
    lstGroupsJsonArr = lstGroupsJsonObj.getJSONArray("allgroups");

    int count = 0;
    String idGroup = "";
    String nameGroup = "";

    while(count < lstGroupsJsonArr.length())
    {
    JSONObject lstTrainersIdx = lstGroupsJsonArr.getJSONObject(count);
    A2100_spin_groups_fields spinBeanGroup = new A2100_spin_groups_fields();

    idGroup = lstTrainersIdx.getString("id");
    nameGroup = lstTrainersIdx.getString("trainGroup");

    spinBeanGroup.setIdGroup(idGroup);
    spinBeanGroup.setNameGroup(nameGroup);

    a2100_spin_groups_array.add(spinBeanGroup);

    count++;

    }

    } catch (MalformedURLException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (JSONException e) {
    e.printStackTrace();
    }

    returnMessage = "";

    } else if (method.equals("DEL"))
    {

    }

    //@Override
    protected void onProgressUpdate(String values)
    {
    super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String result)
    {
    if(result != "") {
    Toast.makeText(ctx,result,Toast.LENGTH_LONG).show();
    }

    }
    }

    }

    Nun der Adapter
    package com.traincounter.jupp.tc;

    import java.util.ArrayList;
    import android.app.Activity;
    import android.content.Context;
    import android.content.res.Resources;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;

    / Adapter class extends with ArrayAdapter */
    public class A2100_spin_groups_fields_adapter extends ArrayAdapter{

    private Activity activity;
    private ArrayList data;
    public Resources res;
    A2100_spin_groups_fields tempValues = null;
    LayoutInflater inflater;

    /***** CustomAdapter Constructor *******/
    public A2100_spin_groups_fields_adapter(
    A2100_member_change activitySpinner,
    int textViewResourceId,
    ArrayList objects,
    Resources resLocal
    )
    {
    super(activitySpinner, textViewResourceId, objects);

    /********** Take passed values **********/
    activity = activitySpinner;
    data = objects;
    res = resLocal;

    /*********** Layout inflator to call external xml layout () **********************/
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public View getDropDownView(int position, View convertView,ViewGroup parent) {
    System.out.println("dropdownview");
    return getCustomView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    System.out.println("---------------------view");
    return getCustomView(position, convertView, parent);
    }

    // This funtion called for each row ( Called data.size() times )
    public View getCustomView(int position, View convertView, ViewGroup parent) {

    /********** Inflate spinner_rows.xml file for each row ( Defined below ) ************/
    View row = inflater.inflate(R.layout.a2100_spin_groups_rowlayout, parent, false);

    /***** Get each Model object from Arraylist ********/
    tempValues = null;
    tempValues = (A2100_spin_groups_fields) data.get(position);

    TextView GrpID = (TextView)row.findViewById(R.id.a2100spinGrp_GroupID);
    TextView GrpName = (TextView)row.findViewById(R.id.a2100spinGrp_GroupName);

    // Set values for spinner each row
    GrpID.setText(tempValues.getIdGroup());
    GrpName.setText(tempValues.getNameGroup());

    return row;

    }

    }

    XML der Activity

    xmlns:tools="xyz"
    android:id="@+id/activity_yorokobi_member_change"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.traincounter.jupp.tc.A2100_member_change">

    <LinearLayout
    android:eek:rientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:weightSum="1">

    <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/A2100_IDMember" />

    <TextView
    android:text="Mitgliedsname:"
    android:layout_width="match_parent"
    android:id="@+id/A2100_tf_MemberName"
    android:layout_height="wrap_content" />

    <EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textPersonName"
    android:text="Name"
    android:ems="10"
    android:id="@+id/A2100_MemberName"/>

    <TextView
    android:text="Gruppe:"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/A2100_tf_MemberGroup"/>

    <Spinner
    android:id="@+id/A2100_MemberGroup"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:drawSelectorOnTop = "true"/>

    <CheckBox
    android:text="aktives Mitglied"
    android:layout_height="50dp"
    android:layout_width="match_parent"
    android:layout_gravity="center"
    android:id="@+id/A2100_MemberAktiv"/>

    <Button
    android:text="Speichern"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/A2100_Save"
    android:elevation="1dp"
    android:eek:nClick="SetMember" />

    <Button
    android:text="Neu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/A2100_New"
    android:eek:nClick="NewMember" />

    <Button
    android:text="Löschen"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/A2100_DEL"
    android:eek:nClick="DelMember" />

    </LinearLayout>

    Das RowLayout für den Spinner

    xmlns:app="xyz/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="53dp"
    android:eek:rientation="vertical"
    android:padding="3dp">

    <TextView
    android:text="TextView"
    android:layout_width="0dp"
    android:layout_height="50dp"
    android:id="@+id/a2100spinGrp_GroupID"
    android:textSize="20sp"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"/>

    <TextView
    android:layout_toRightOf="@id/a2100spinGrp_GroupID"
    android:text="TextView"
    android:layout_width="wrap_content"
    android:layout_height="50dp"
    android:id="@+id/a2100spinGrp_GroupName"
    android:textSize="20sp"
    android:layout_alignParentTop="true" />

    Die Klasse für die ITEMS
    package com.traincounter.jupp.tc;

    /**
    * Created by Jupp on 13.11.2016.
    */

    public class A2100_spin_groups_fields {

    private String idGroup;
    private String nameGroup;

    public String getNameGroup() {
    return nameGroup;
    }

    public void setNameGroup(String nameGroup) {
    this.nameGroup = nameGroup;
    }

    public String getIdGroup() {
    return idGroup;
    }

    public void setIdGroup(String idGroup) {
    this.idGroup = idGroup;
    }

    }
     
  14. Hallo Buggy,
    ich mach das mit der DropBox. Muss ich aber noch zusammenstellen.
    Dann hast du nur eine Activity.
     
  15. Hallo Joob, Code bitte immer in Code-Tags, sonst wird mir schwindelig. Der Arzt hat auch gesagt, ich soll nich :)
    Gut, packs zusammen, und dann schauen wir mal drüber. Das wird schon, keine Panik!
     
  16. Geht es auch mit weTransfer ist einfacher, benötige nur deine Mailadresse.
    Die kannst du mir auch auf joob@freenet.de senden, dann sehen die nicht alle.
    Ich habe das ganze Projekt gepackt, kannst du so laufen lassen.
     
  17. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!