So habe ich verschiedene Layouts für diese eine Aktivität.
Und ich habe verschiedene Klassen, die jeweils öffnen und ihr Ding mit einem Layout machen.
Ich injiziere diese Klassen in der Aktivität über @Inject. All das ist ohne Problem.
Aber wenn ich @InjectView auf einem der Steuerelemente im nicht aktiven Layout verwende, erhalte ich einen Fehler.
11-02 19: 17: 31.086: FEHLER / AndroidRuntime (1326): verursacht durch: java.lang.NullPointerException: Kann keinen Nullwert in die Klasse injizieren be.baes.notes.View.EditNoteImpl.saveButton, wenn das Feld nicht @Nullable
ist
Dies wäre dann der Code.
%Vor%Ich kann das aber machen.
%Vor%Gibt es einen besseren Weg, dies zu tun?
Ich habe gerade begonnen, Roboguice zu benutzen, damit jemand mit mehr Erfahrung eine bessere Antwort geben kann, aber das ist es, was ich bis jetzt gefunden habe:
In roboguice-1.1.2 (der aktuellen stabilen Version) werden @InjectView
-Elemente nur injiziert, wenn setContentView()
zum ersten Mal in der Aktivität aufgerufen wird. Da Ihr Code setContentView()
dynamisch von den Hilfsklassen aufruft, werden die dort injizierten Objekte nicht korrekt injiziert.
In roboguice-2.0b2 (der aktuellen Betaversion) gibt es Unterstützung für mehrere setContentView()
Aufrufe und Ihr Code sollte funktionieren. Gesprungene Ansichten sind jedoch immer noch an die Kontextaktivität gebunden (anstelle der deklarierenden Klasse), so dass jedes @InjectView
möglicherweise auch @Nullable
für alle Hilfsklassen sein muss, die dieselbe Aktivität teilen.
Da das Problem hier im multiplen Layout (und somit in mehreren setContentView()
-Aufrufen) in einer einzelnen Aktivität verwurzelt ist, können Sie es wie folgt vermeiden:
<include/>
-Tag, um alle Layouts in ein übergeordnetes FrameLayout zu laden: %Vor%
setContentView()
eine Methode, die das sichtbare Layout der Aktivität umschaltet, etwa so: %Vor%
Die obige Alternative sollte sowohl für die stabile als auch für die Beta-Roboguice-Version funktionieren. Der Kompromiss hier ist, dass wir mehrere Layouts gleichzeitig laden, anstatt jedes zu verschiedenen Zeiten zu laden. Es scheint gut genug für mich zu funktionieren (obwohl es für Ihre Bedürfnisse anders sein könnte).
Eine Sache, die ich beachten sollte, ist die auf der aktuellen Seite "Von RoboGuice 1.1 auf 2.0 upgraden" Folgendes wird erwähnt:
Die Möglichkeit, @InjectView in Views zu verwenden (obwohl Sie anrufen müssen RoboGuice.injectMembers () selbst, da es keine RoboView-Basis gibt Klasse und wahrscheinlich wird nie sein.)
Es scheint, dass Sie damit Ihre Hilfsklassen so implementieren können, dass sie von View abgeleitet werden und @InjectView
in ihnen besser funktionieren lassen (hoffentlich müssen sie nicht @Nullable
sein, da sie weniger an die Aktivität gebunden sind). Betrachtet man jedoch den aktuellen Code, scheint diese Funktion noch nicht implementiert zu sein (obwohl ich auf den falschen Platz hätte schauen können).