Ich habe res/layout/main.xml
diese und andere Elemente eingeschlossen:
<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />
In onCreate meiner Aktivität mache ich Folgendes:
setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }
Die anderen Elemente wurden erfolgreich gefunden, kommen jedoch foo
auf null zurück. MyCustomView hat einen Konstruktor MyCustomView(Context c, AttributeSet a)
und ein Log.d(...)
am Ende dieses Konstruktors wird erfolgreich in logcat angezeigt, kurz bevor der "epische Fehler" auftritt.
Warum ist foo
null?
(MyCustomView) foo = findViewById(R.id.foo);
seinMyCustomView foo = (MyCustomView) findViewById(R.id.foo);
?Ich habe das gleiche Problem, weil ich in meiner benutzerdefinierten Ansicht den Konstruktor überschrieben, aber den Superkonstruktor ohne attrs-Parameter aufgerufen habe. Das ist Kopieren Einfügen)
Meine vorherige Konstruktorversion:
Jetzt habe ich:
Und das funktioniert!
quelle
Ich hatte das gleiche Problem. Mein Fehler war: Ich schrieb
und da ich einen Inflater verwendet habe, um die Ansicht aus einer XML-Datei zu "laden", war die letzte Zeile falsch. Um es zu lösen, musste ich schreiben:
Ich habe meine Lösung geschrieben, falls jemand das gleiche Problem hat.
quelle
Es scheint eine Vielzahl von Gründen zu geben. Ich habe gerade "Clean ..." in Eclipse verwendet, um ein ähnliches Problem zu lösen. (FindViewByID hatte zuvor funktioniert und aus irgendeinem Grund null zurückgegeben.)
quelle
Gleiches Problem, aber andere Lösung: Ich habe nicht angerufen
BEVOR ich versucht habe, die hier angegebene Ansicht zu finden
quelle
Wenn Sie mehrere Layoutversionen haben (abhängig von der Bildschirmdichte, SDK-Versionen), stellen Sie sicher, dass alle das gesuchte Element enthalten.
quelle
In meinem Fall gab findViewById null zurück, da meine benutzerdefinierte Ansicht im Haupt-XML ungefähr so aussah:
und ich fand heraus, dass es beim Hinzufügen des XML-Materials so funktionierte:
quelle
Stellen Sie sicher, dass die
setContentView(R.layout.main)
Anweisung vor der Anweisung aufgerufen wirdfindViewById(...)
.quelle
Für mich wurde das Problem gelöst, als ich den Ordner res in den Projekteinstellungen zur Quelle im Java-Erstellungspfad hinzufügte.
quelle
Ich bin vor einiger Zeit auf dasselbe Problem gestoßen, als ich eine benutzerdefinierte Ansicht über das Layout-XML hinzugefügt und dann versucht habe, einen Rückruf an eine andere Stelle in der Anwendung anzuhängen ...
Ich habe eine benutzerdefinierte Ansicht erstellt und sie meiner "layout_main.xml" hinzugefügt.
Und in der Hauptaktivität wollte ich einige Rückrufe anhängen und Verweise auf die UI-Elemente aus dem XML erhalten.
Der Initilizer hat nichts Besonderes getan, aber alle Änderungen, die er an der benutzerdefinierten Ansicht (MUIComponent) oder anderen nicht benutzerdefinierten UI-Elementen vornehmen wollte, wurden in der Anwendung einfach nicht angezeigt .
Der Unterschied zwischen "badInst" und "goodInst" ist:
quelle
Dies ist mir mit einer benutzerdefinierten Komponente für Wear passiert, ist aber ein allgemeiner Ratschlag. Wenn Sie einen Stub verwenden (wie ich ihn verwendet habe
WatchViewStub
), können Sie den Anruf nicht einfach an einefindViewById()
beliebige Stelle richten. Alles im Stummel muss zuerst aufgeblasen werden, was nicht erst danach passiertsetContentView()
. Sie sollten also so etwas schreiben, um darauf zu warten:quelle
Mein Problem war ein Tippfehler. Ich hatte statt
android.id
(Punkt) geschriebenandroid:id
. : P.Anscheinend gibt es keine Syntaxprüfung in meiner benutzerdefinierten Komponente xml. :(
quelle
Hatte das gleiche Problem.
Ich hatte Layout mit wenigen Kindern. Vom Konstruktor eines von ihnen habe ich versucht, einen Verweis (unter Verwendung von context.findViewById) auf ein anderes Kind zu erhalten. Es hat nicht funktioniert, weil das zweite Kind im Layout weiter definiert wurde.
Ich habe es so gelöst:
Es würde auch funktionieren, wenn die Reihenfolge der Kinder entgegengesetzt wäre, aber ich denke, es sollte im Allgemeinen wie oben gemacht werden.
quelle
findViewById
im Konstruktor von a verwendenView
, sondern den Initialisierungscode eingebenOnFinishInflate
?Die
findViewById()
Methode wird manchmal zurückgegeben,null
wenn der Stamm des Layouts keinandroid:id
Attribut hat. Der Eclipse-Assistent zum Generieren einer Layout-XML-Datei generiert nicht automatisch einandroid:id
Attribut für das Stammelement.quelle
In meinem Fall befand sich die Ansicht im übergeordneten Element NICHT in der Ansicht, in der ich sie aufrufen wollte. In der untergeordneten Ansicht musste ich also Folgendes aufrufen:
quelle
Die Option "sauber" hat bei mir funktioniert.
In meinem Fall liegt die Hauptursache darin, dass sich der Quellcode auf einer Netzwerkfreigabe befindet und meine Workstation und mein Dateiserver nicht korrekt synchronisiert wurden und um 5 Sekunden verschoben wurden. Die Zeitstempel für die von Eclipse erstellten Dateien liegen in der Vergangenheit (da sie vom Dateiserver zugewiesen werden) für die Uhr der Workstation, sodass Eclipse die Abhängigkeiten zwischen generierten und Quelldateien falsch auflöst. In diesem Fall scheint eine 'Bereinigung' zu funktionieren, da sie eine vollständige Neuerstellung anstelle einer inkrementellen Erstellung erzwingt, die von falschen Zeitstempeln abhängt.
Nachdem ich die NTP-Einstellungen auf meiner Workstation korrigiert hatte, trat das Problem nie wieder auf. Ohne die richtigen NTP-Einstellungen würde dies alle paar Stunden passieren, da die Uhren schnell driften.
quelle
So fügen Sie den Antworten einen weiteren trivialen Fehler hinzu:
Überprüfen Sie, ob Sie tatsächlich die richtige Layout-XML-Datei bearbeiten ...
quelle
Ich hatte das gleiche Problem, weil ich vergessen habe, die Ansichts-ID in allen meinen Layout-Ordnern zu aktualisieren.
quelle