Java – Android – Split Aktivität / Klasse in mehrere Dateien für eine bessere Organisation (Lösung)

Ich bin nicht PRO in JAVA, aber ich fand mich von verrückt mit Android-Aktivitäten immer zu groß.
Nach ein paar Seiten Code-Länge fand ich mich endgültig hin und her blättern!
Nicht nur OnClickhandler können riesig werden, nur eine Menge von Code neigt dazu, in einer größeren Aktivität zusammenzufassen.
Fragmente waren keine Lösung für mich.
Im Allgemeinen erlaubt Java nicht, eine Klasse in mehrere Dateien aufzuteilen, so dass ein Hack benötigt wird.

Ich habe durch viele Stackoverflow-Threads hinweg durchsucht, nicht eine Lösung.
Ich habe es trotzdem gelöst, vielleicht hilft das anderen.

Dies ist ein bisschen Android konzentriert, wie ich von meinem riesigen onClick Handler für alle Menüs und Tasten geärgert habe, aber ich denke, es wird für andere allgemeine Java-Probleme sowie die gleiche Weise zu arbeiten.

  • Wie bekomme ich Klicks auf RecyclerView (NICHT die Kinder)
  • Wie man onClickListener-Methode von Button auf einem ListView verwendet
  • OnItemClickListener auf einem ListView innerhalb eines Fragments funktioniert nicht
  • Android-Taste onClickListener
  • Android - OnClick Listener in einer separaten Klasse
  • Klickbare Bildfläche
  • Wie kann ich OnClickListeners aus den ViewHolders von RecyclerView entfernen, wenn sie entsorgt werden?
  • Warum funktioniert OnClickListener auf einem ViewHolder nicht?
  • 2 Solutions collect form web for “Java – Android – Split Aktivität / Klasse in mehrere Dateien für eine bessere Organisation (Lösung)”

    Ein einfacher Ansatz, den ich folge, ist, die View-Sorgen in eine separate Klasse zu verschieben (nennen wir es ViewManager) und machen die Aktivität / Fragment nur als Controller arbeiten.

    Ein ViewManager ist in der Regel verantwortlich für –

    • Aufblasen des Layouts
    • Verweise auf alle Ansichten
    • Daten in den Ansichten anzeigen
    • Umgang mit Klick- / Touch-Events
    • Animationen

    Die Aktivität / Fragment ist nur verantwortlich für –

    • Daten abrufen und an den ViewManager weitergeben, um ihn anzuzeigen
    • Handhabung der Navigation
    • Daten an einen Server / DB senden

    Für UI-Steuerelemente, die eine Aktion auslösen, die der Controller verantwortlich macht, sagen Sie, dass eine neue Aktivität gestartet wird, wenn eine Schaltfläche angeklickt wird, empfängt der ViewManager den Klick und ruft eine Methode in der Steuerung auf, die sich um die Navigation kümmert.

    Wenn du den Boilerplate-Code weiter beseitigen möchtest (Klick-Handler, findViewById () Anrufe usw.), erwäge die Verwendung von Bibliotheken wie ButterKnife .

    Eine Lösung ist einfach, man kann die Hauptklassenfelder public
    Doch das wird Ihr Code durcheinander bringen, sollten Sie die Felder privat halten, wenn möglich. Abgesehen von besseren Code-Abschluss Ihrer IDE ist es auch den Schutz der Klassen von illegalen außerhalb Manipulation.

    Nun war der Trick für mich Innenklassen.
    Eine innere Klasse kann auf die privaten Felder des Elternteils zugreifen, aber Java erlaubt auch nicht, eine innere Klasse in eine andere Datei zu legen.
    Es muss INSIDE der übergeordneten Klasse definiert werden.
    Hier begann ich zu graben und fand eine Lösung, die als akzeptabel angesehen werden könnte.
    Wenn dies Java-Experten weh tut, würde ich mich nicht entschuldigen;)

    Der Trick ist, eine "abstrakte Klasse" in einer eigenen Java-Datei zu erstellen.
    Ich habe es ein bisschen außerhalb Konventionen, um es abheben: InnerMainActivity_onClickHandlers.java
    MainActivity ist meine Hauptklasse (die Eltern der neuen inneren Klasse)

    In meiner Parentclass habe ich dieses Feld definiert, eine normale innere Klasse, aber die neue Klasse zu erweitern:

     private class inner extends InnerMainActivity_onClickHandlers{ public inner(MainActivity mainActivity) { super(mainActivity); } }; 

    In meinem MainActivity.onCreate:

     Button.setOnClickListener(new inner(this)); 

    Wie Sie sehen können, wie Sie sehen können, übergibt es die MainActivity (Parent) an die innere Klasse.

    Jetzt die innere Klasse selbst:

     public abstract class InnerMainActivity_onClickHandlers implements View.OnClickListener { private final MainActivity main; public InnerMainActivity_onClickHandlers(MainActivity mainActivity) { this.main = mainActivity; } @Override public void onClick(View view) { // here implement the listener } } 

    Um diese Arbeit wie angekündigt zu machen, müssen Sie die private Eigenschaften Ihrer MainActivity / Parent zu protected .
    Jetzt hat die erweiterte innere Klasse Zugriffsrechte auf die übergeordneten Felder, aber jede externe Klasse kann noch nicht darauf zugreifen.

    In diesem Fall habe ich eine dedizierte Klasse für alle onclick Zuhörer, eine zweite Klasse könnte für andere Dinge verwendet werden.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.