2010-01-02 22 views
2

J'ai trois classes une activité principale (appelée MainMap), une classe de non-activité (appelée MyItemizedOverlay) et une classe d'activité (appelée AudioStream). Je souhaite démarrer l'activité AudioStream à partir de la classe sans activité, mais je ne sais pas comment le faire. J'ai essayé ce est en troisième classe (appelée MyItemizedOverlay):Utilisation de l'intention de la classe de non-activité

  Intent myIntentA = new Intent(MainMap.this, AudioStream.class); 
      myIntentA.putExtra(AUDIO_STREAM,AUDIO_STREAM_URL); 
      MojProg.this.startActivity(myIntentA); 

mais cela ne fonctionne pas, dit: Non instance englobante du type MainMap est accessible portée

Que dois-je faire? Qu'est-ce que j'écris à la place de MainMap.this?

Répondre

2

Ce n'est pas tellement une question Android que c'est une question Java. A moins que vous ne fassiez de "MyItemizedOverlay" une classe interne de "MainMap" (voir http://forums.sun.com/thread.jspa?threadID=690545), ce dont vous avez réellement besoin, c'est que MyItemizedOverlay stocke une référence interne à l'objet MainMap qu'il souhaite utiliser pour l'inent.

Cordialement, Mark

+0

Merci Mark pour stocker une référence interne à l'objet MainMap qu'il veut utiliser pour l'inent? pouvez-vous me donner un exemple sur la façon de faire cela? – Nikola

+0

Typiquement, vous le feriez en passant la référence MainMap en tant que paramètre au constructeur MyItemizedOverlay, puis en la stockant dans un membre de données à l'intérieur de l'objet MyItemizedOverlay. Si vous utilisez cette approche, cependant, vous devrez gérer le MainMap étant "démoli" et reconstruit via les méthodes onSaveInstanceState et onRestoreInstanceState afin de maintenir une référence valide. – Mark

0
Intent myIntentA = new Intent(MainMap.this, AudioStream.class); 
myIntentA.putExtra(AUDIO_STREAM,AUDIO_STREAM_URL); 
MojProg.this.startActivity(myIntentA); 

Cela ne fonctionnera pas. Parce que "ceci" signifie "cette classe". Vous ne pouvez pas l'utiliser sur un autre cours (Oui, vous pouvez le faire, mais il y a différentes façons de le faire.) S'il vous plaît étudier sur "ceci" sur les forums, sur ce site ou sur le site web d'Oracle.). C'est la raison de cet avertissement. Eh bien, on dirait que votre question est "Comment puis-je tirer le contexte d'une classe de non-activité?". (Le premier paramètre de Intent() est Context).

Pour ce faire, vous pouvez créer un instant de contexte dans votre activité principale et affecter votre contexte de base à elle comme:

static Context context; 

.... 

context = this.getBaseContext(); 

Ne pas oublier que votre activité principale. Puis dans votre classe de non-activité, vous pouvez tirer ce contexte et l'utiliser avec l'intention comme:

Context context; 
Intent intent; 

....Constructor: 

context = MainActivity.context; 
intent = new Intent(context, YourSecondActivity.class); // you have to declare your second activity in the AndroidManifest.xml 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this is required to call "Intent()" in a non-activity class. 

//And then you can call the method anywhere you like (in this class of course) 

context.startActivity(intent); 

Ok. Vous êtes prêt à aller après un pas de plus. Dans AndroidManifest.xml, déclarez votre deuxième activité comme la première;

<activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="landscape" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".YourSecondActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="landscape" 
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> 
    </activity> 

Vous êtes prêt maintenant. Mais un dernier avertissement, n'oubliez pas de disposer de votre activité avant d'en ouvrir une autre pour éviter les retards. Amusez-vous.