Injectview (Roboguice) funktioniert nicht mit mehreren Layouts

8

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?

    
chrissie1 02.11.2011, 18:39
quelle

1 Antwort

4

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:

  • Anstatt mehrere Layouts zu verwenden, verwenden Sie ein einzelnes Layout mit dem <include/> -Tag, um alle Layouts in ein übergeordnetes FrameLayout zu laden:
%Vor%
  • Verwenden Sie dann anstelle von 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).

    
Joe 08.11.2011, 22:01
quelle

Tags und Links