8

È possibile dichiarare una classe che estende Attività all'interno di un'altra classe di attività? Se lo è, come potrei registrare quella classe nel manifest? Inoltre, è qualcosa che può essere ragionevolmente fatto o è una cattiva idea?Classe attività interna annidata in Android

Stavo pensando a qualcosa di simile

class ListClass extends ListActivity{ 

    ... 
    ArrayList items; 

    class ItemClass extends Activity{ 

     ... 
     Item item; 

     @Override 
     onCreate(){ 
      Integer pos = getIntent().getExtras().getInt("pos"); 
      item = items.get(pos); 
     } 
    } 

    @Override 
    onItemClick(int position){ 

     startActivity(new Intent(this, ItemClass.class).putExtra("pos", position)); 

    } 
} 

Nota la sintassi non è corretta al 100%, ovviamente, per lo pseudocodice.

+0

Perché vorresti farlo? – EboMike

+1

Sto cercando di pensare al modo migliore per dare il mio ItemClass agli oggetti nella mia lista ArrayList senza un servizio di intermediazione. – Falmarri

+3

Ricorda che le attività possono essere distrutte in qualsiasi momento (c'è anche un'opzione di debug per forzare che ciò accada). Qualsiasi attività precedente potrebbe essere distrutta in qualsiasi momento. Non puoi fare affidamento su attività precedenti. Passa i dati attraverso l'intento o tramite un fornitore di contenuti o attraverso le preferenze condivise. – EboMike

risposta

1

No, non è possibile. Dopo tutto, il sistema operativo Android dovrà creare un'istanza dell'attività se viene avviato in qualsiasi momento (ad esempio, se lo si avvia attraverso un intento) ed è impossibile creare un'istanza di ItemClass senza un genitore ListClass.

Ricorda che ogni attività è completamente indipendente e può essere avviata in qualsiasi momento attraverso un intento.

+2

questo è sbagliato. Puoi farlo totalmente. Vedi la risposta di Dustin sotto. – whoabackoff

+4

@whoabackoff - Come una classe interna STATIC, certo, ma non è stato chiesto - in questo modo, non saresti in grado di accedere agli "articoli", che è specificamente ciò che l'OP chiedeva. – EboMike

1

Sarei anche curioso di sapere perché vorresti farlo.

Tuttavia, non vedo alcun motivo per cui non funzionerebbe. Non potresti fare riferimento ad AndroidManifest come faresti normalmente fintanto che entrambe le classi sono pubbliche? vale a dire com.falmarri.ListClass.ItemClass?

Modifica: non importa, questo non funziona come indicato da EboMike.

+0

In che modo il sistema operativo istanzia l'ItemClass senza ListClass? Non è una classe statica. – EboMike

+0

Giusto, e quindi non sarà in grado di accedere alle variabili di istanza di ListClass, motivo per cui ha voluto farlo in primo luogo, quindi sconfigge lo scopo. Risulta che non funziona comunque per le classi statiche. –

10

Sì, funziona - è solo un'altra classe - è sufficiente per dichiarare la vostra attività usando la notazione classe interna in AndroidManifest.xml:.

< attività android: name =" listclass $ itemClass "/ >

sembra funzionare bene per me, ma forse quando questa domanda è stato chiesto, non è stato supportato nelle versioni precedenti di Android?

Non so PERCHÉ vorresti farlo, ma puoi farlo.

+0

funziona per me usando classi interne statiche. – whoabackoff

+0

@Dustin Si potrebbe voler incapsulare un'attività in un CustomView se è utilizzato solo da quella particolare vista –

+1

La classe interna deve essere statica! – Ali