Cannot refer to a non-final variable i inside an inner class defined in a different method

  • Antworten:4
  • Bentwortet
Gerd Schluckebier
  • Forum-Beiträge: 20

03.01.2015, 11:16:46 via Website

Hallo,
ich möchte gerne nach Anklicken eines Buttons eines Button Arrays bt[i] eine neue Seite aufrufen
und Parameter übergeben, die vom Index i abhängig sind.
Leider bekomme ich immer die Meldung:
Cannot refer to a non-final variable i inside an inner class defined in a different method

Code:
startDownload();
for (int i=1; i < 3 ;i++){
bt[i].setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String pw1=bt[i].getText().toString();
String pw2=autor[i].getText().toString();
String pw3=thema[i].getText().toString();
Intent intent = new Intent(com.aktuelles.MainActivity.this,Activity.class );
intent.putExtra("PW1",pw1);
intent.putExtra("PW2",pw2);
intent.putExtra("PW3",pw3);
startActivity(intent);
}
});
}

Finde keine Lösung außer dem n-maligen Wiederholen des Codes

MfG Gerd

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

03.01.2015, 12:02:58 via Website

Da man die Schleifenvariable nicht final machen kann, kannst Du sie stattdessen für jeden Durchlauf in einer temporären, lokalen final-Variable speichern.
Die kannst Du dann problemlos in anonymen inneren Klassen nutzen.

Mal in pseudo-code

for (int i ...) {
   final int i2 = i;

   new InnerClass() {
       void foo() {
             System.out.println(i2);
       }
   }
}

— geändert am 03.01.2015, 12:09:23

Antworten
Sven R.
  • Forum-Beiträge: 1.904

03.01.2015, 12:18:00 via App

Zusätzlich kannst du statt

bt[i]

das hier verwenden

v

Das View v ist ein Parameter der onClick(View v).

Edit: Zur Verwendung von buttonspezifischen Methoden vorher noch casten

((Button) v)

Nochmal Edit: Du solltest nicht den einen Parameter aus dem Button holen. Speicher den String zusätzlich woanders und benutze den.

Letzter Edit: Die drei Arrays scheinen alles Buttonarrays zu sein. Für die gilt das selbe.

— geändert am 03.01.2015, 12:24:00

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Gerd Schluckebier
  • Forum-Beiträge: 20

03.01.2015, 12:52:23 via Website

Danke,
manchmal ist die Lösung so einfach
MfG

Antworten
Sven R.
  • Forum-Beiträge: 1.904

03.01.2015, 15:39:43 via App

Bitte! 😀

Wie gesagt ist es aber besser, wenn du die Daten für deinen String nicht aus dem Button holst, sondern woanders noch gespeichert hast.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten