Wie geht man mit Buttermesser um, binden Sie sowohl in Baseactivity als auch in Subaktivitäten?

8

Es gibt eine BaseActivity mit einem Layout und einer Subaktivität, die diese BaseActivity erweitert.

Wie binden Sie Ansichten, sodass Ansichten in BaseActivity in BaseActivity verknüpft sind und Ansichten in Sub-Aktivitäten dort gebunden sind?

Hier ist ein Beispielcode, der das aktuelle Szenario erklärt, Hinweis : Beispielcode wurde aus hier <übernommen / p>

BASISAKTIVITÄT

%Vor%

UNTERTÄTIGKEIT

%Vor%

Das obige Szenario hat viele Fehler verursacht, wie z. B. das Auffinden der Ansicht mit der ID nicht möglich,

Nach vielen Recherchen fand ich eine Menge Themen, die dasselbe diskutierten,

Link 1

Link 2

Link 3

Link 4

Nachdem ich alle Links durchgegangen bin, habe ich die folgenden Kombinationen ausprobiert, aber keiner von ihnen hat funktioniert

  1. Rufen Sie ButterKnife.bind(this) in BaseActivity, aber nicht in SplashActivity auf.
  2. Rufen Sie ButterKnife.bind(this) in beiden Aktivitäten auf.
  3. Aufruf ButterKnife.bind(this) in SplashActivity , mit dieser Kombination konnte ich nicht auf die View-Elemente von BaseActivity zugreifen, da sie sich als null erwiesen haben.

Meine Frage Wie binden Sie die Elemente BaseActivity und SplashActivity View?

Genaue Fehlerzeile

%Vor%

Für Ihre nette Notiz existieren die Ansichten im Layout.

Bearbeiten 1:

Ich habe Code hinzugefügt, der setContentView();

überschreibt     
Bat Cat 22.02.2018, 05:06
quelle

5 Antworten

2

Es ist einfach.

Haben Sie Ihre abstrakte BaseActivity als:

%Vor%

Dann erweitern Sie einfach Ihre Aktivität mit BaseActivity als:

%Vor%

Ich bevorzuge mehrere Basisklassen in meinem Projekt. Sie können eine BaseToolbarActivity haben, die BaseActivity wie folgt erweitert:

%Vor%

Wenn also Ihre Activity Layout-Symbolleiste hat, dann erweitern Sie sie auf BaseToolbarActivity , ansonsten erweitern Sie sie auf BaseActivity

Für weitere solche Klassen können Sie mein Projekt unter

beziehen

Ссылка

    
Chintan Soni 22.02.2018 06:30
quelle
2

Ich nur habe es geschafft, einen der Kommentare zu betrachten. Ich denke, dein wirkliches Problem ist überhaupt nicht mit der Unterklasse zu tun. Es ist das Layout. Ich denke, dass Sie das Unterklassenlayout im Oberklassenlayout einbeziehen wollen. Leider überlagern Sie das Superklassenlayout in der Unterklasse. Ich denke, Sie müssen das Layout der Basisaktivität in Ihre Unterklasse aufnehmen (wahrscheinlich in ein Merge-Tag im Layout eingebunden) Wiederverwendung von Layouts mit Include - Fügen Sie Ihr Basisaktivitätslayout (Symbolleiste usw.) in Ihre Unterklasse ein Layout (Begrüßungsbildschirm) ..

-

(Ich denke, die unten stehenden Informationen sind jetzt irrelevant, aber lassen Sie sie dort, falls Sie interessiert sind)

Also, wenn ich das Problem richtig verstehe, scheint es, dass im Wesentlichen die Butterknife Bindng in der Superklasse (Basisaktivität) passiert, bevor die Unterklasse (splashactivity) ihr Layout einrichten kann.

Die Idee, eine getLayourResourceId (überschrieben in der Unterklasse) zu verwenden, funktioniert wahrscheinlich für die meisten Leute, da sie der Unteraktivität erlaubt, ihr Layout für die Superaktivität zu spezifizieren, bevor sie butterknife.bind aufruft.

Wenn Sie also davon ausgehen, dass dies korrekt ist, wäre eine andere Möglichkeit, das Problem anzugehen, das Verzögern der Bindung, bis das Layout spezifiziert wurde.

mit anderen Worten;

%Vor%

... bind wird später aufgerufen, wenn onStart aufgerufen wird ....         }

%Vor%

und

%Vor%

Natürlich ist es nicht immer bequem (oder korrekt), von onStart zu binden, aber es könnte helfen, die Funktionsweise der anderen Lösungen aufzuzeigen.

Viel Glück, CJ

    
C James 05.03.2018 12:49
quelle
1

Die Nachricht in der Exception sagt Ihnen, was zu tun ist:

Erforderliche Ansicht 'txtName' mit der ID 2131296567 für das Feld 'txtName' wurde nicht gefunden. Wenn diese Ansicht optional ist, fügen Sie eine Annullierung "@nullable" hinzu.

Fügen Sie es entweder zu Ihrem Layout hinzu oder machen Sie die Feldbindung optional mit einer @Nullable-Annotation.

Siehe Link

    
Mohd Saquib 22.02.2018 05:16
quelle
1

in Aktivität A wird die Instanz von Aktivität A festgelegt. Entfernen Sie die Datei butterknife.bind in BaseActivity.

%Vor%

Ordnen Sie die View-Instanz in childActivity mit ButterKnife.bind gut zu.

%Vor%

für Fragment

%Vor%

Sie entfernen das Buttermesser in der Basisaktivität. Grund darin, dass: - in der Basisaktivität keine Sicht vorhanden ist, Buttermesser zuzuweisen, unnötige annehmen, es gibt mehr als eine 10 Aktivität, die nicht leicht zu verwalten ist.

    
Ashwani kumar 22.02.2018 05:31
quelle
1

Aktualisieren Sie Ihre BaseActivity als:

%Vor%

Und SubActivity wie:

%Vor%     
Firoz Memon 22.02.2018 09:00
quelle

Tags und Links