ID von generierten Edittext-Felder speichern

  • 18 Antworten
  • Letztes Antwortdatum
Status
Dieses Thema wurde gelöst! Zur Lösung springen…
H

HoustonWeHaveAProblem

Neues Mitglied
0
Guten Morgen zusammen,

ich brauche mal euren Rat.

Wie speichere ich am besten die ID von den generierten Edittext-Felder?
Ich möchte gerne auch außerhalb der Forschleife auf die generierte Edittext-Felder zugreifen, nur bekomme ich dann die Fehlermeldung:

Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference


So wie ich das verstehe, kann er die EditText-Felder außerhalb der Schleife nicht mehr zuordnen.




Java:
                            for (i = 1; i <= NumberOfColumns; i++) {
                            linearLayout = view.findViewById(R.id.linear);
                            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                             LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                            layoutParams.setMargins(0, 70, 0, 0);
                            etBetrag[i] = new EditText(getActivity());
                            etGewicht[i] = new EditText(getActivity());
                            etPreisKg[i] = new EditText(getActivity());

Java:
                            etGewicht[i].setHint(R.string.Preiskg);
                            etGewicht[i].setId(View.generateViewId());
                            etGewicht[i].setBackgroundResource(R.drawable.textviewborder);
                            edittextId.put(etGewicht[i],i);
                            linearLayout.addView(etGewicht[i], layoutParams);

                            etPreisKg[i].setBackgroundResource(R.drawable.textviewborder);
                            etPreisKg[i].setHint(R.string.Gewicht);
                            etPreisKg[i].setId(View.generateViewId());
                            linearLayout.addView(etPreisKg[i], layoutParams);

                            etBetrag[i].setBackgroundResource(R.drawable.textviewborder);
                            etBetrag[i].setHint(R.string.Betrag);
                            etBetrag[i].setId(View.generateViewId());
                            linearLayout.addView(etBetrag[i], layoutParams);[
}



Gruß,

Houston,WeHaveAProblem
 
Zuletzt bearbeitet:
Empfohlene Antwort(en)
Dein "i" ist eine lokale Variable der for Schleife . Die hast du nicht im Listener.
der Kompiler benutzt hier 0 und in deinen Arrays ist auf 0 nichts vorhanden deine for geht mit 1 los.

OK du hast ein i in der Klasse aber das wird nicht gesetzt ist 0 . und in den Arrays ist bei 0 nichts drin.
das i in der for und in der Klasse zwei verschidene Variablen die geich heisen.
Im listener wird dir Klassen Variable benutzt.
Da sind wir wider bei Sichtbarkeit und Gültigkeit von Variablen.
 
Zuletzt bearbeitet:
Alle Antworten (18)
@jogimuc Das Problem habe ich schon mit Singleton gelöst.

Nur lasse ich mir die Edittext-Felder dynamisch erstellen, nur möchte ich gerne wissen, wie ich sicher gehen kann das ich die Edittext-Felder auch außerhalb der For-Schleife benutzen kann.


Gruß,
 
Hallo
Erstens hast du gar keine id (int) erstellt.
Du hast ein Objekt Instanz erstellt.

So jetzt die Frage wie sieht dei e Liste oder dynamisches Array aus? edittextId.
Wo an welcher Stelle im Code hast du die erstellt?


Außerdem hast du nur eine Liste von einem edittext.
 
  • Danke
Reaktionen: swa00
@jogimuc, ich habe ein Array erstellt der die Edittext speichern tut.




EditText[] etGewicht = new EditText[16]

EditText[] etPreis = new EditText[16]

EditText[] etBetrag = new EditText[16]
 
OK und wo hast du das erstellt. Im Klassen Rumpf oder in einer Methode?



Was ist oder soll das.?
edittextId.put(etGewicht,i)

Und eine id hast du dem Objekt nicht gegen das habe ich dir schon gesagt und @swa00 auch er hat dir auch die richtige Methode genannt.

Ps.

Gültigkeit, Sichtbarkeit von Variablen beachten würde ich empfehlen.
Java Grundlagen.
 
Zuletzt bearbeitet:
Guten Tag,
Java:
private EditText[] etBetrag = new EditText[16];
  private EditText[] etPreisKg = new EditText[16];
  private EditText[] etGewicht = new EditText[16]
    private int i;


Mit SetId vergebe ich die generierte EditText-Felder eine ID,oder?
Java:
etBetrag[i].setId(View.generateViewId());

Was ist oder soll das.?
edittextId.put(etGewicht,i)
Den habe ich wohl übersehen.

OK und wo hast du das erstellt. Im Klassen Rumpf oder in einer Methode?
Im Klassen-Rumpf
 
Zuletzt bearbeitet:
Wenn es InstanzVariablen sind.
Solltest du auch innerhalb der Klasse, auch mit private zugreifen können.

Von wo aus willst du zugreifen?

Recht wenige Infos für die du uns gibst.
Beiträge automatisch zusammengeführt:

. Mit SetId vergebe ich die generierte EditText-Felder eine ID,oder?

Nein mit deinem Code Beispiel würdest du jedem die gleiche id geben. Du musst der Methode schon einen string geben der bei allen anderen anders ist.
Ist das gleiche wie beim xml.

Was du machst geht nicht.
Aber du kannst doch auch direkt auf die Elemente zugreifen ohne id.
 
Zuletzt bearbeitet:
@jogimuc Ich möchte in der for-Schleife mir EditText-Felder genieren lassen, die sollen dann auch außerhalb der for-Schleife zugreifbar sein.

Nur außerhalb der der for-Schleife kann ich nicht mehr auf die EditText-Felder zugreifen, da keine ID übergeben wird.


singleTonClass.setSchrottPreisKg(etPreisKg[i].getText().toString()); singleTonClass.setSchrottGewicht(etGewicht[i].getText().toString()); singleTonClass.setSchrottBetrag(etBetrag[i].getText().toString());

Ich werde es mal anders versuchen!
 
Zuletzt bearbeitet:
wenn du in der gleichen Klasse bist wie dein Array kannst du zugreifen ganz normal.
zeige den gesamten code.
Für was wozu brauchst du eine ID? Du hast das Objekt die Instanz im Array.

genau dieser Code sollte gehen wenn du das in der gleichen Klasse machst.
 
Zuletzt bearbeitet:
@jogimuc


Forschleife .......





Java:
  spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

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


                                    Toast.makeText(getActivity(), "Item " +
                                            parentView.getItemAtPosition(Selecteditem).toString(), Toast.LENGTH_LONG).show();

                                    Selecteditem = position;
                                   

                                }

                                @Override
                                public void onNothingSelected(AdapterView<?> parentView) {
                                    // your code here
                                }

                            });

                            KundenInfobt.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {


                                    switch (spinner.getItemAtPosition(Selecteditem).toString()) {

                                        case "Schrott,Stanzabfälle":


                                            singleTonClass.setSchrottPreisKg(etPreisKg[i].getText().toString());
                                            singleTonClass.setSchrottGewicht(etGewicht[i].getText().toString());
                                            singleTonClass.setSchrottBetrag(etBetrag[i].getText().toString());


                                            break;


                                        case "E-Motore":

                                            singleTonClass.setEMotorPreisKg(etPreisKg[i].getText().toString());
                                            singleTonClass.setEMotorGewicht(etGewicht[i].getText().toString());
                                            singleTonClass.setEMotorBetrag(etBetrag[i].getText().toString());

                                            break;

                                           
                                                     default:



                                    }

                                    // Der User wird weitergeleitet zur der nächste Activity

                                    Intent intent = new Intent(getActivity(), CustomActivity.class);
                                    startActivity(intent);
                                    getActivity().finish();

                                }
                            });
 
Zuletzt bearbeitet:
Und wo ist jetzt das Problem?
Du greifst doch auf deine Arrays zu. Speicherst es doch auch scheinbar in der Singelton Klasse.
 
@jogimuc
Java:
 java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
 
wo und wann kommt der Fehler . mache ein Debugging um zu sehen wo es passiert.
 
Zuletzt bearbeitet:
@jogimuc Sobald ich den Button klicke stürzt die App ab.

Wie ich das verstehe, weiß Java nicht, welcher EditText gemeint ist,oder?
 
Dein "i" ist eine lokale Variable der for Schleife . Die hast du nicht im Listener.
der Kompiler benutzt hier 0 und in deinen Arrays ist auf 0 nichts vorhanden deine for geht mit 1 los.

OK du hast ein i in der Klasse aber das wird nicht gesetzt ist 0 . und in den Arrays ist bei 0 nichts drin.
das i in der for und in der Klasse zwei verschidene Variablen die geich heisen.
Im listener wird dir Klassen Variable benutzt.
Da sind wir wider bei Sichtbarkeit und Gültigkeit von Variablen.
 
Zuletzt bearbeitet:
Danke für die Hilfe, Jogimuc!

Ich hätte noch eine Frage an euch.

Ich lasse mir auch Text-Spinners generieren was auch klappt.

Nur in der onItemSelected-Methode, habe ich eine Globale Variable erstellt, die mir den ausgewählte Item ausgibt.
Nur wenn ich mehrere Spinners erstelle, wird die Variable immer überschrieben von den letzten Spinner.
Da wollte ich mal fragen, ob ihr wisst, wie man alle ausgewählte Item speichern kann.
Ich habe es auch schon mit List versucht, nur bekam ich kein Ergebnis



Java:
final int finalI = i;

spinner[finalI].setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {


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


                            Selecteditem = position;

                            System.out.println("Spinner: " + finalI + " Item-Position " + Selecteditem);



                        }
 
 
       @Override
                        public void onNothingSelected(AdapterView<?> parentView) {
                            // your code here
                        }

                    });


                    KundenInfobt.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {


                            switch (spinner[finalI].getItemAtPosition(Selecteditem).toString()) {


Output:
Code:
//Beim erstellen der Spinner
Spinner: 1 Item-Position 0
Spinner: 2 Item-Position 0

//Item ausgesucht
Spinner: 1 Item-Position 1
Spinner: 2 Item-Position 2
 
Zuletzt bearbeitet:
Hallo auch hier in diesem Forum wurde dir schon geholfen. Ich wusste die ganze Zeit das du das mit den Mehrere Text-Spinners auf einen setOnItemSelectedListener arbeiten lassen | NextPit Forum bist.

Den Grund hast du im anderen Forum eigentlich schon bekommen.

Erstens gibt es in Java keine globalen Variablen maximal Instanzvariablen.
Deine“ finalI“ ist lokal mit Sicherheit ist dein „i auch nicht viel weiter sichtbar.


Wie ich aus dein alten mittlerweile gelöschten Github Code weis ist der Button nur einmal am ende deines Layouts vorhanden. Das zeigst oder sagst du hier auch wieder nicht verschweigst wie immer die Hälfte. Auch in anderen Forum wurde dir gesagt das du nicht 5 Spinner in eine Variable speichern kannst.


Wenn du dir den Status die Pos der einzelnen Spinner merken willst musst du das auch in einer Liste oder Array machen. Nicht in einer einfachen „int“ Variable die nur platz für einen Wert hat.



Wenn der listener auf gerufen wird hast du mit Sicherheit keinen Bezug mehr zu deiner „finalI“ Variablen. Und wenn ja was ist da logischer weise drin?

[EDIT by Mod] Jörg, habe deinen Link angepasst , da war ein Tippfehler drin :)
@swa00 Danke sorry

PS. Ich sehe gerade das mit deiner Seleceditem Variablen ist das selbe das ist auch nur ein „int“ mehr nicht.
 
Zuletzt bearbeitet:
Bearbeitet von: jogimuc - Grund: swa00
  • Danke
Reaktionen: HoustonWeHaveAProblem und swa00
Status
Dieses Thema wurde gelöst! Zur Lösung springen…

Ähnliche Themen

B
Antworten
6
Aufrufe
1.316
jogimuc
J
J
Antworten
1
Aufrufe
264
swa00
swa00
A
Antworten
4
Aufrufe
569
AppDevelopment
A
Zurück
Oben Unten