2016-10-11 4 views
0

Ich habe ein seltsames Problem mit Java für Android erlebt. Ich erstelle einen Listener für eine Schaltfläche und muss eine Textbearbeitung als Zeichenfolge auswählen und sie in eine Zeichenfolge zurückgeben, die als Authentifizierungsprüfung verwendet wird.
Ich bekomme einen Fehler, dass ich die Variable AccessCraw als endgültig deklarieren muss und wenn ich es als ein Finale erstelle, sagt es, dass ich es nicht bearbeiten kann. Wie kann ich das machen, ohne eine ganze Reihe von Fehlern zu bekommen? (Code unten)Java lässt mich Variable als endgültig deklarieren, aber dann lasse ich mich nicht daran schreiben

boolean loggedin = (false); 
    boolean acsessgranted = (false); 
    final String AccessCraw = "no"; 
    Button submit = (Button) findViewById(R.id.Submit); 
    Button startBtn = (Button) findViewById(R.id.EmailAdmin); 
    final EditText AccessCode = (EditText) findViewById(R.id.ACentry); 

    if(acsessgranted == (false)) { 
     setContentView(R.layout.activity_frun); 
    } 

    if(acsessgranted == (true)) { 
     if(loggedin == (false)) { 
      setContentView(R.layout.login); 
     } 
    } 

    if(acsessgranted == (true)) { 
     if(loggedin == (true)) { 
      cont(); 
     } 
    } 

    startBtn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      sendEmail(); 
     } 
    }); 
    submit.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      AccessCraw = AccessCode.getText().toString(); 
     } 
    }); 
} 
+0

Was ist der Zweck der Erstellung einer endgültigen Variablen? – droidev

+1

Warum versuchen Sie, diese Variable zuzuweisen? Die Variable befindet sich außerhalb des Gültigkeitsbereichs, bevor das Ereignis ausgelöst wird. – 4castle

+0

Deklarieren Sie AccessCraw als globale Variable, die möglicherweise Ihr Problem löst. – raasesh

Antwort

0

Ich denke, das ist das, was Sie wissen müssen:

Wenn Sie nicht EditText im cla weiten Rahmen setzen und stattdessen es in OnCreate erklären, es möchte, dass es als endgültig erklärt wird.

So deklarieren Sie Ihre EditeText im Clas-weiten Bereich.

0

Dies ist sehr ähnlich zu einer popular issue in JavaScript. Sie sollten globalen Variablen nicht aus asynchronen Ereignissen zuweisen müssen. Rufen Sie stattdessen eine Methode auf, die den Wert als Parameter verwendet.

Rufen Sie den Code, der den asynchronen Wert benötigt, im Ereignishandler auf.

0

Wenn Sie eine solche Warnung erhalten, machen Sie die Variable global.
Grund? Wenn Sie eine Variable in innerclass verwenden, erstellt sie eine neue Kopie dieser Variablen und alle daran vorgenommenen Änderungen werden nicht nach außen reflektiert. Deshalb deklarieren wir die Variable final und nehmen keine Änderungen vor, um Konflikte zu vermeiden. Wenn Sie jedoch Änderungen an dieser Variablen vornehmen müssen, machen Sie sie global, so dass sie denselben Zugriff auf alle Klassen hat und keine Duplikate erstellt werden. Lesen Sie Java-Dokumente für weitere Details.

Und wie in einer der Antworten erwähnt, um die Datensicherheit beizubehalten, schlug es vor, Setter und Getter zu verwenden, die die Variable aus inneren Klassen oder asynchronen Menthoden manipulieren.

0

Die Deklaration einer Variablen als endgültig wird vorgenommen, um zu verhindern, dass ihr Wert in der Zukunft geändert wird. Offensichtlich können Sie den Wert deshalb nicht ändern.

Android und Java im Allgemeinen erfordert Variablen, die nicht im globalen (Klassenebene) Geltungsbereich deklariert sind, um als final deklariert zu werden, wenn Sie sie in einer inneren Klasse verwenden möchten. Dies dient dazu, Verwirrung zu vermeiden, wenn die Variable geändert wird.

Wie andere erwähnt haben, müssen Sie den String im globalen Gültigkeitsbereich deklarieren, wenn Sie den String mit einem Wert beginnen möchten.

Verwandte Themen