8

Est-ce que déclarer une classe qui étend l'activité dans une autre classe d'activité est possible? Si c'est le cas, comment pourrais-je enregistrer cette classe dans le manifeste? Aussi, est-ce quelque chose qui peut raisonnablement être fait ou est-ce une mauvaise idée?Classe d'activité interne imbriquée dans android

Je pensais à quelque chose comme

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)); 

    } 
} 

Notez la syntaxe est pas 100% correct évidemment, la plupart du temps pseudocode.

+0

Pourquoi voudriez-vous faire cela? – EboMike

+1

J'essaye de penser à la meilleure manière de donner à mon ItemClass l'accès aux objets dans mes articles ArrayList sans service de courtage. – Falmarri

+3

Gardez à l'esprit que les activités peuvent être détruites à tout moment (il y a même une option de débogage pour forcer cela). Toute activité précédente pourrait être détruite à tout moment. Vous ne pouvez pas compter sur les activités précédentes. Transmettez les données via l'intention ou via un fournisseur de contenu ou via les préférences partagées. – EboMike

Répondre

1

Non, ce n'est pas possible. Après tout, le système d'exploitation Android devra instancier l'activité si elle est démarrée à tout moment (par exemple si vous la lancez intentionnellement), et il est impossible d'instancier un ItemClass sans un parent ListClass. Rappelez-vous que chaque activité est complètement indépendante et peut être démarrée à tout moment grâce à une intention.

+2

c'est faux. Vous pouvez totalement faire cela. Voir la réponse de Dustin ci-dessous. – whoabackoff

+4

@whoabackoff - En tant que classe interne STATIQUE, bien sûr, mais cela n'a pas été demandé - de cette façon, vous ne pourrez pas accéder à des "items", ce qui est spécifiquement demandé par l'OP. – EboMike

1

Je serais également curieux de savoir pourquoi vous voudriez faire ceci.

Cependant, je ne vois aucune raison pour laquelle cela ne fonctionnerait pas. Ne pourriez-vous pas le référencer dans le AndroidManifest comme vous le feriez normalement tant que les deux classes sont publiques? c'est-à-dire com.falmarri.ListClass.ItemClass? Edit: Nevermind, cela ne fonctionne pas comme le souligne EboMike.

+0

Comment le système d'exploitation instancierait-il ItemClass sans ListClass? Ce n'est pas une classe statique. – EboMike

+0

À droite, et alors il ne sera pas en mesure d'accéder aux variables d'instance de ListClass, c'est pourquoi il voulait le faire en premier lieu, donc cela va à l'encontre du but. Il s'avère que cela ne fonctionne pas pour les classes statiques de toute façon. –

10

Oui, il ne fonctionne pas - il est juste une autre classe - il vous suffit de déclarer votre activité en utilisant la notation de classe interne dans AndroidManifest.xml.

< activité android: name = » listclass $ ItemClass "/ >

semble fonctionner très bien pour moi, mais peut-être quand cette question a été posée, il n'a pas été pris en charge dans les anciennes versions d'Android?

Incertain POURQUOI vous voudriez faire ceci, mais vous pouvez.

+0

cela fonctionne pour moi en utilisant des classes internes statiques. – whoabackoff

+0

@Dustin Vous pouvez encapsuler une activité dans une vue personnalisée si elle est uniquement utilisée par cette vue particulière –

+1

La classe interne doit être statique! – Ali