Erstellen einer mehrsprachigen Anwendung in Java. Beim Einfügen eines Zeichenfolgenwerts aus einer R.string
Ressourcen-XML-Datei wird ein Fehler angezeigt :
public static final String TTT = (String) getText(R.string.TTT);
Dies ist die Fehlermeldung:
Fehler: Es kann kein statischer Verweis auf die nicht statische Methode getText (int) vom Typ Context erstellt werden
Wie wird das verursacht und wie kann ich es lösen?
java
compiler-errors
static-methods
Chen M.
quelle
quelle
getString()
Sie sie immer an, wenn Sie sie brauchen. Auf diese Weise passt sich Ihre Anwendung ordnungsgemäß an Benutzer an, die ihre ausgewählte Sprache ändern.Antworten:
Da
getText()
es nicht statisch ist, können Sie es nicht über eine statische Methode aufrufen.Um zu verstehen warum, muss man den Unterschied zwischen den beiden verstehen.
Instanzmethoden (nicht statisch) arbeiten mit Objekten eines bestimmten Typs (der Klasse). Diese werden mit dem neuen wie folgt erstellt:
Um eine Instanzmethode aufzurufen, rufen Sie sie auf der Instanz (
myObject
) auf:Eine statische Methode / ein statisches Feld kann jedoch nur für den Typ direkt aufgerufen werden. Sagen Sie Folgendes:Die vorherige Anweisung ist nicht korrekt. Man kann auch auf statische Felder mit einer Objektreferenz wie verweisenmyObject.staticMethod()
, dies wird jedoch nicht empfohlen, da nicht klar ist, dass es sich um Klassenvariablen handelt.Und die beiden können nicht zusammenarbeiten, da sie unterschiedliche Datenräume (Instanzdaten und Klassendaten) bearbeiten.
Lass mich versuchen zu erklären. Betrachten Sie diese Klasse (Pseudocode):
Jetzt habe ich folgenden Anwendungsfall:
Was sind die Werte?
Gut
Mit anderen Worten,
TTT
ist ein Datum, das von allen Instanzen des Typs gemeinsam genutzt wird. Es macht also keinen Sinn zu sagenDie Frage ist also, warum TTT statisch ist oder warum getText () nicht statisch ist.
Entfernen Sie das
static
und es sollte diesen Fehler überwinden - aber ohne zu verstehen, was Ihr Typ tut, ist es nur ein Heftpflaster bis zum nächsten Fehler. Was sind die Anforderungen dafürgetText()
, dass es nicht statisch sein muss?quelle
Es gibt bereits einige gute Antworten mit Erklärungen, warum die Mischung der nicht statischen
Context
MethodegetText()
nicht mit Ihrer verwendet werden kannstatic final String
.Eine gute Frage ist: Warum möchten Sie das tun? Sie versuchen, a
String
aus Ihrerstrings
Ressource zu laden und seinen Wert in einpublic static
Feld einzufügen. Ich gehe davon aus, dass dies so ist, dass einige Ihrer anderen Klassen darauf zugreifen können? In diesem Fall ist dies nicht erforderlich. Übergeben Sie stattdessen einContext
in Ihre anderen Klassen und rufen Sie von dortcontext.getText(R.string.TTT)
aus an.Und um dies von Ihrem zu nennen
Activity
:Auf diese Weise können Sie auf Ihre
String
Ressource zugreifen , ohne einpublic static
Feld verwenden zu müssen.quelle
String a[] = context.getTextArray(R.array.myStringArray);
; es gibt mir jedoch einen FehlerThe method getTextArray(int) is undefined for the type Context
- warum sollte es undefiniert sein, während es mit getText funktioniert?Context
keine Methode namens hatgetTextArray
, aber hatgetText
. Vielleicht denken Sie daran,Resources
was hatgetTextArray
für andere, die dies in der Suche finden:
Ich bekomme diese oft, wenn ich versehentlich eine Funktion mit dem Klassennamen und nicht mit dem Objektnamen aufrufe. Dies geschieht normalerweise, weil ich ihnen zu ähnliche Namen gebe: P.
dh:
Dies ist offensichtlich eine statische Methode. (gut für etwas) Aber was ich wirklich tun wollte (in den meisten Fällen war)
Es ist so ein dummer Fehler, aber alle paar Monate verschwende ich ungefähr 30 Minuten damit, mit Vars in den "MyClass" -Definitionen herumzuspielen, um herauszufinden, was ich falsch mache, wenn es wirklich nur ein Tippfehler ist.
Witziger Hinweis: Der Stapelüberlauf hebt die Syntax hervor, um den Fehler hier wirklich offensichtlich zu machen.
quelle
Sie können Ihre Variable entweder nicht statisch machen
oder machen Sie die "getText" -Methode statisch (wenn überhaupt möglich)
quelle
getText ist Mitglied Ihrer Aktivität und muss daher aufgerufen werden, wenn "this" vorhanden ist. Ihre statische Variable wird initialisiert, wenn Ihre Klasse geladen wird, bevor Ihre Aktivität erstellt wird.
Da die Variable aus einer Ressourcenzeichenfolge initialisiert werden soll, kann sie nicht statisch sein. Wenn Sie möchten, dass es statisch ist, können Sie es mit dem String-Wert initialisieren.
quelle
Sie können mit der nicht statischen Methode nicht auf statische Variablen verweisen. Um dies zu verstehen, müssen Sie den Unterschied zwischen statisch und nicht statisch verstehen.
Statische Variablen sind Klassenvariablen. Sie gehören zur Klasse mit ihrer einzigen Instanz, die nur bei der ersten erstellt wird. Nicht statische Variablen werden jedes Mal initialisiert, wenn Sie ein Objekt der Klasse erstellen.
Wenn Sie nun zu Ihrer Frage kommen und den Operator new () verwenden, erstellen wir eine Kopie aller nicht statischen Dateien für jedes Objekt. Dies ist jedoch bei statischen Feldern nicht der Fall. Aus diesem Grund tritt ein Fehler bei der Kompilierung auf, wenn Sie auf eine statische Variable aus einer nicht statischen Methode verweisen.
quelle
Diese Frage ist nicht neu und die vorhandenen Antworten geben einen guten theoretischen Hintergrund. Ich möchte nur eine pragmatischere Antwort hinzufügen.
getText ist eine Methode der abstrakten Context-Klasse. Um sie aufzurufen, benötigt man eine Instanz ihrer Unterklasse (Aktivität, Dienst, Anwendung oder andere). Das Problem ist, dass die öffentlichen statischen endgültigen Variablen initialisiert werden, bevor eine Instanz von Context erstellt wird.
Es gibt verschiedene Möglichkeiten, dies zu lösen:
quelle