2014-12-04 16 views
7

Non sono PRO in JAVA, ma mi sono ritrovato ad impazzire con le attività Android che diventano troppo grandi.
Dopo alcune pagine di lunghezza del codice mi sono ritrovato a scorrere continuamente avanti e indietro!
Non solo gli utenti di OnClickhandler possono crescere enormemente, solo un sacco di codice tende a riassumere in un'attività più grande.
I frammenti non erano una soluzione per me.
In generale, Java non consente di suddividere una classe in più file, quindi è necessario un trucco.Java - Android - Attività/Classe suddivisa in più file per una migliore organizzazione (soluzione)

Ho analizzato un sacco di thread di stackoverflow per quanto riguarda questo, non uno aveva una soluzione.
L'ho risolto comunque, forse questo aiuta gli altri.

Questo è un po 'Android focalizzato come mi sono preso dai miei enormi onClick Handlers per tutti i menu e pulsanti, ma suppongo che funzionerà anche per altri problemi generali di Java allo stesso modo.

risposta

3

Una soluzione è semplice, è possibile rendere i campi della classe principali public
Tuttavia che la volontà rovinare il vostro codice, si dovrebbe tenere i campi privata quando possibile. Oltre al migliore completamento del codice del tuo IDE, protegge anche le classi da manipolazioni esterne illegali.

Ora il trucco per me erano le classi interne.
Una classe interna può accedere ai campi privati ​​del suo genitore, tuttavia Java non consente di inserire una classe interna in un altro file.
Deve essere definito all'interno della classe genitore.
Questo è il punto in cui ho iniziato a scavare e ho trovato una soluzione che potrebbe essere considerata accettabile.
Se questo fa male agli esperti di java, sarei felice di non essere downvoted;)

Il trucco è creare una "classe astratta" in un proprio file java.
ho chiamato un po 'le convenzioni esterne per farlo risaltare: InnerMainActivity_onClickHandlers.java
MainActivity è la mia classe principale (il genitore della nuova classe interna)

Nel mio ParentClass ho questo campo definito, una classe interna normale, ma estendendo la nuova classe:

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

Nel mio MainActivity.onCreate:

Button.setOnClickListener(new inner(this)); 

Come puoi vedere, come puoi vedere passa MainActivity (Parent) alla classe Inner.

Ora la classe interna iteself:

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 
    } 
} 

per fare questo lavoro come pubblicizzato è necessario modificare le proprietà del private MainActivity/Parent a protected.
Ora la classe interna estesa dispone dei diritti di accesso ai campi padre, tuttavia qualsiasi classe esterna non può ancora accedervi.

In questo caso ho una classe dedicata per tutti gli ascoltatori onclick, una seconda classe potrebbe essere utilizzata per altre cose.

4

Un approccio semplice che seguo è spostare i problemi di visualizzazione in una classe separata (chiamiamolo ViewManager) e fare in modo che Activity/Fragment funzioni solo come controller.

Un ViewManager è generalmente responsabile -

  • Gonfiare il layout di
  • Ottenere riferimenti a tutti i punti di vista
  • Visualizzazione dei dati nelle viste
  • Manipolazione clic/tocca eventi
  • animazioni

The Activit y/Frammento è responsabile solo per -

  • dati prendendo e passarlo al ViewManager per visualizzarlo
  • Handling navigazione
  • i dati di invio a un server/DB

Per controlli UI che innescare un'azione di cui è responsabile il controller, ad esempio lanciando una nuova attività quando si fa clic su un pulsante, ViewManager riceve il clic e chiama un metodo nel controller che si occupa della navigazione.

Se si desidera eliminare ulteriormente il codice di codice (clic gestori, chiamate FindViewById(), ecc), considerare l'utilizzo di librerie come ButterKnife.

0

Facile. Dividi la tua attività in superclassi e sottoclassi astratte. È possibile separare come più vi piace, ma per esempio si potrebbe avere:

public abstract class MyNavDrawerHandler extends AppCompatActivity 
... 
public abstract class AllMyViewInflaters extends MyNavDrawerHandler 
... 
public class AllMyButtonListeners extends AllMyViewInflaters 

variabili dichiarate protected sono condivisi tra queste classi. Nelle superclassi è possibile dichiarare i metodi abstract che costringono le sottoclassi a implementare il metodo. Ecco come si invia un evento a sottoclassi.

Questo è anche ottimo perché consente di riutilizzare una classe di livello superiore. Ad esempio, potresti implementare MyNavDrawerHandler in tutte le tue attività.

+0

La domanda è stata risposta 3 anni fa già ... In che modo la tua risposta è diversa dalla risposta di 3 anni fa? – John

+0

Onestamente non ho capito la tua risposta. Dovresti rimuovere la prima parte in cui parli di campi di classi pubbliche e classi interne. Le classi interne non hanno niente a che fare con questo –