Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

benötige non final - putExtra will final!

Das Thema "benötige non final - putExtra will final!" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 15.11.2011, 17:14   #1 (permalink)
Fortgeschrittenes Mitglied
 
Benutzerbild von IceClaw

Modell: Galaxy Nexus

Registriert seit: 16.10.2010
Beiträge: 461
Abgegebene Danke: 25
Erhielt 110 Danke für 62 Beiträge
Standard benötige non final - putExtra will final!

und wieder grüßt das Murmeltier

In der Datenbank stehen Labels, die auf Buttons kommen und Zahlen, die beim Intent als putExtra übergeben werden.

PHP-Code:
for(int i=0i<howLongi++)
            {
                
buttons[i] = new Button(this); 
                
buttons[i].setText(lab);
                
ll.addView(buttons[i], new LayoutParams(420LayoutParams.WRAP_CONTENT));
                
buttons[i].setOnClickListener(new View.OnClickListener()
                {
                    public 
void onClick(View v)
                    {
                        
Intent myIntent = new Intent(v.getContext(), Internet.class);
                        
myIntent.putExtra("internet"intnr);
                        
startActivity(myIntent);
                    }
                });

                if(
!= howLong-1)
                {
                    
bttnLab.moveToNext();
                    
lab bttnLab.getString(0);
                    
intNum.moveToNext();
                    
intnr intNum.getInt(0);
                }
            } 
intnr ist eine Zahl, die aus der Datenbank aus der entsprechenden ROW rausgelesen wird.
In der if() kann man gut sehen, wie ich dann zum nächsten ROW hüpfe und intnr eine neue Zahl bekommt.

Das Problem:
putExtra() möchte ein final! Allerdings ist final schelcht, wenn ich den wärt ändern möchte

Hat dazu jemand eine Idee?!

MfG Ice
__________________
Galaxy Nexus: Android 4.0.4 (ICS) - Stock
HP Touchpad: Android 4.0.4 (ICS) - CM9 Alpha 2.0 NIGHLTY (22.04.2012)
IceClaw ist offline   Mit Zitat antworten
Alt 15.11.2011, 17:17   #2 (permalink)
Android Guru

Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
Standard AW: benötige non final - putExtra will final!

wenn du vorher einfach ne neue final var deklarierst?

final Integer tmp = new Integer(intr);

oder sowas in die richtung
__________________
App Entwicklung
Latest apps: Media Streamer BETA | DailyCash | MoneyManager ( PRO | HD )
swordi ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei swordi für diesen Beitrag:
IceClaw (17.11.2011)
Alt 15.11.2011, 17:22   #3 (permalink)
Android Guru

Modell: T-Mobile G1, Nexus One, Samsung Galaxy Tab 10.1, Samsung Galaxy Nexus

Registriert seit: 04.05.2009
Beiträge: 1.599
Abgegebene Danke: 128
Erhielt 210 Danke für 193 Beiträge
Standard AW: benötige non final - putExtra will final!

Zitat:
Zitat von IceClaw Beitrag anzeigen

intnr ist eine Zahl, die aus der Datenbank aus der entsprechenden ROW rausgelesen wird.
In der if() kann man gut sehen, wie ich dann zum nächsten ROW hüpfe und intnr eine neue Zahl bekommt.

Das Problem:
putExtra() möchte ein final! Allerdings ist final schelcht, wenn ich den wärt ändern möchte

Hat dazu jemand eine Idee?!

MfG Ice
Java lernen

Deine anonyme innere Klasse braucht final weil sie sonst nicht weiß wie sie an den Wert kommen soll. Entweder das oder du definierst sie als Klassenvariable.
Eine Methode kann nicht verlangen eine final Variable zu bekommen. Das existiert nicht in Java.
__________________
Follow/Add/Circle/Whatever me on Google+

Solitaire HD, ein Solitaire optimiert für Honeycomb.
the_alien ist offline   Mit Zitat antworten
Alt 15.11.2011, 18:06   #4 (permalink)
Fortgeschrittenes Mitglied
 
Benutzerbild von IceClaw

Modell: Galaxy Nexus

Registriert seit: 16.10.2010
Beiträge: 461
Abgegebene Danke: 25
Erhielt 110 Danke für 62 Beiträge
Standard AW: benötige non final - putExtra will final!

Hallo,

wenn ich eine Klassenvariable
int intnr;
mache, dann wird immer das letzte was ich hinzugefügt habe als intnr zu JEDEM Button hinzugefügt! oO
Warum?

MfG Ice
__________________
Galaxy Nexus: Android 4.0.4 (ICS) - Stock
HP Touchpad: Android 4.0.4 (ICS) - CM9 Alpha 2.0 NIGHLTY (22.04.2012)
IceClaw ist offline   Mit Zitat antworten
Alt 15.11.2011, 19:28   #5 (permalink)
Android Experte
 
Benutzerbild von DieGoldeneMitte

Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
Standard AW: benötige non final - putExtra will final!

Wenn du eine Instanzvariable (Klassenvariablen sind die mit static -- das nur zur Info) hast, wird der Wert genommen, denn diese Variable zum Zeitpunkt hat, wenn der Callback gerufen wird.

Wenn du in der Schleife (beim Erzeugen der Callbacks) immer wieder einen Wert an eine Variable zuweist, hat diese beim Aufruf der Callbacks natürlich den zuletzt zugewiesenen Wert.

In deinem Fall wäre wohl ein Array fällig. -- und etwas Java Nachhilfe, wie the_alien schon sagt
__________________
Kein Support via PN/eMail. Bitte das Forum benutzen - dort haben alle etwas davon.
Bei Entwicklerfragen zu abstürzenden Apps bitte immer die Ausgabe von LogCat posten.
Tipp: Zum "Danke" sagen gibt es einen Button.
DieGoldeneMitte ist offline   Mit Zitat antworten
Alt 15.11.2011, 21:24   #6 (permalink)
Fortgeschrittenes Mitglied
 
Benutzerbild von IceClaw

Modell: Galaxy Nexus

Registriert seit: 16.10.2010
Beiträge: 461
Abgegebene Danke: 25
Erhielt 110 Danke für 62 Beiträge
Standard AW: benötige non final - putExtra will final!

HI,

also danke erstmal für die Antworten!

Allerdings verstehe ich echt.. naja eigentlich kaum was oO
Ich habe Grundlagen in Java - etwas mehr vielleicht - deswegen frage ich ja auch...

Also nochmal zum mitschreiben:
alien sagt, ich soll eine Klassenvariable machen:
PHP-Code:
static int intnr
Wenn ich das mache, dann wird, wie ich schon geschrieben habe, nur immer die letzte ausgabe gemacht.

DieGoldeneMitte will, dass ich ein array mache, sähe also so aus??:
PHP-Code:
static int[] intnr
und dann entsprechend den rest intnr als array deklarieren..?
Dann bekomme ich aber beim catch() einen error (Selbstgeschreibenes Toast )

Also wie bitte soll ich das jetzt anstellen?

MfG Ice
__________________
Galaxy Nexus: Android 4.0.4 (ICS) - Stock
HP Touchpad: Android 4.0.4 (ICS) - CM9 Alpha 2.0 NIGHLTY (22.04.2012)
IceClaw ist offline   Mit Zitat antworten
Alt 15.11.2011, 21:59   #7 (permalink)
Android Guru

Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
Standard AW: benötige non final - putExtra will final!

was wäre, wenn du aus der inner class deines listeners eine "anständige" klasse baust

der gibst du dann den int paramter im construktor mit und setzt es dann in der onClick methode.
__________________
App Entwicklung
Latest apps: Media Streamer BETA | DailyCash | MoneyManager ( PRO | HD )
swordi ist offline   Mit Zitat antworten
Alt 16.11.2011, 07:36   #8 (permalink)
Fortgeschrittenes Mitglied

Modell: HTC Sensation

Registriert seit: 31.08.2011
Beiträge: 390
Abgegebene Danke: 25
Erhielt 59 Danke für 57 Beiträge
Standard AW: benötige non final - putExtra will final!

laß mal static weg und schreib private hin, dann sollte das klappen, oder google mal nach Klassenvariablen und Instanzvariablen in java.
Tom299 ist offline   Mit Zitat antworten
Alt 16.11.2011, 10:17   #9 (permalink)
Android Guru

Modell: T-Mobile G1, Nexus One, Samsung Galaxy Tab 10.1, Samsung Galaxy Nexus

Registriert seit: 04.05.2009
Beiträge: 1.599
Abgegebene Danke: 128
Erhielt 210 Danke für 193 Beiträge
Standard AW: benötige non final - putExtra will final!

Zitat:
Zitat von IceClaw Beitrag anzeigen
HI,

also danke erstmal für die Antworten!

Allerdings verstehe ich echt.. naja eigentlich kaum was oO
Ich habe Grundlagen in Java - etwas mehr vielleicht - deswegen frage ich ja auch...

Also nochmal zum mitschreiben:
alien sagt, ich soll eine Klassenvariable machen:
PHP-Code:
static int intnr
Wenn ich das mache, dann wird, wie ich schon geschrieben habe, nur immer die letzte ausgabe gemacht.

DieGoldeneMitte will, dass ich ein array mache, sähe also so aus??:
PHP-Code:
static int[] intnr
und dann entsprechend den rest intnr als array deklarieren..?
Dann bekomme ich aber beim catch() einen error (Selbstgeschreibenes Toast )

Also wie bitte soll ich das jetzt anstellen?

MfG Ice
Ich glaube du hast nicht verstanden wie innere anonyme Klassen arbeiten.
Lies dir den entsprechenden Part erst mal durch
Java ist auch eine Insel – 6.12 Innere Klassen
__________________
Follow/Add/Circle/Whatever me on Google+

Solitaire HD, ein Solitaire optimiert für Honeycomb.
the_alien ist offline   Mit Zitat antworten
Alt 16.11.2011, 22:07   #10 (permalink)
Android Guru
 
Benutzerbild von Fr4gg0r

Modell: Samsung Galaxy S (I9000)

Registriert seit: 21.12.2009
Beiträge: 2.572
Abgegebene Danke: 76
Erhielt 506 Danke für 295 Beiträge
Standard AW: benötige non final - putExtra will final!

Zitat:
Zitat von the_alien Beitrag anzeigen

Deine anonyme innere Klasse braucht final weil sie sonst nicht weiß wie sie an den Wert kommen soll.
Da muss ich widersprechen^^
Dem Compiler/VM kann das eigentlich banane sein ob final oder nicht, es dient scheinbar lediglich dem Zweck, dass dem Programmierer bewusst ist, womit die innere Klasse arbeitet.

Beweis:
Code:
    public void fubar(long value){
        Button button = null;
        final long a = System.currentTimeMillis(); //blöde Konstantenoptimierung
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                fubar(a);
            }
        });
    }
disassembliert (teile ausgelassen):

Die Methode fubar()
Code:
# virtual methods
.method public fubar(J)V
    .locals 4
    .parameter "value"

    .prologue
    .line 8
    const/4 v2, 0x0

    .line 9
    .local v2, button:Landroid/widget/Button;
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J

    move-result-wide v0

    .line 10
    .local v0, a:J
    new-instance v3, Lde/tests/test2$1;

    invoke-direct {v3, p0, v0, v1}, Lde/tests/test2$1;-><init>(Lde/tests/test2;J)V

    invoke-virtual {v2, v3}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V

    .line 15
    return-void
.end method
Und die vom Compiler erstellte innere Klasse
Code:
.class Lde/tests/test2$1;
# interfaces
.implements Landroid/view/View$OnClickListener;


# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
    value = Lde/tests/test2;->fubar(J)V
.end annotation

# instance fields
.field final synthetic this$0:Lde/tests/test2;

.field private final synthetic val$a:J

# direct methods
.method constructor <init>(Lde/tests/test2;J)V
    .locals 0
    .parameter
    .parameter

    .prologue
    .line 1
    iput-object p1, p0, Lde/tests/test2$1;->this$0:Lde/tests/test2;

    iput-wide p2, p0, Lde/tests/test2$1;->val$a:J

    .line 10
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method


# virtual methods
.method public onClick(Landroid/view/View;)V
    .locals 3
    .parameter "v"

    .prologue
    .line 12
    iget-object v0, p0, Lde/tests/test2$1;->this$0:Lde/tests/test2;

    iget-wide v1, p0, Lde/tests/test2$1;->val$a:J

    invoke-virtual {v0, v1, v2}, Lde/tests/test2;->fubar(J)V

    .line 13
    return-void
.end method
Man kann sehr schön sehen, dass der Konstruktor geändert wird, und eine Kopie des Wertes bzw. bei Objekten die Referenz kopiert wird.
Fr4gg0r ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
[ROM]Honeysense v.1.4 FINAL Der_Androide Custom-Roms für HTC Desire 22 22.09.2011 07:36
CyanogenMod 7 FINAL itsme1 Root / Hacking / Modding für Nexus One 97 21.05.2011 08:42
StreakDroid 1.9.0 final UKSheep Root / Hacking / Modding für Dell Streak 23 24.03.2011 09:33
Final Freeway for Android OS apfelnase Android Spiele 1 20.12.2010 20:57
CM6 Final Release Pander Root / Hacking / Modding für HTC Wildfire 14 17.12.2010 17:14




Du liest gerade: "benötige non final - putExtra will final!" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.