2010-12-15 104 views
-1

J'ai un MapView, avec itemizedoverlays, exactement comme dans l'exemple de guide des développeurs Android: http://developer.android.com/resources/tutorials/views/hello-mapview.htmlIl est possible de démarrer une classe Intent from ItemizedOverlay? (Point MapView)

sur le itemizedoverlay, j'ai une boîte de dialogue personnalisée, avec un bouton. Tout va bien jusqu'à ici, mais maintenant j'ai des problèmes en essayant d'ajouter la fonctionnalité au bouton. J'ai besoin que le bouton commence une nouvelle activité, mais je ne peux pas réaliser cela ... pourquoi? parce que sur cette ligne: i = new Intent (NyItemizedOverlay.class, Locate.class); j'ai la classe d'intention actuelle en tant que premier paramètre, et la classe d'intention de cible au deuxième paramètre. MyItemizedOverlay n'est pas une classe Intent ... c'est l'extension ItemizedOverlay, alors elle ne compile pas quand j'essaye de lancer l'intention, j'essaye de passer une classe normale comme premier argument, et elle a besoin d'une classe d'intention. Je dois mettre la classe de lanceur, mais la classe de lancement n'est pas une intention: S

Si j'essaye de mettre une autre classe d'intention sur le premier argument, j'ai eu cette erreur: No enclosing instance of the type AllActivity is accessible in scope .... (AllActivity est un public classe d'activité de mon application)

Comment puis-je résoudre ce problème?

code complet ici:

public class MyItemizedOverlay extends ItemizedOverlay { 


private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
private ArrayList<String> permissions = new ArrayList<String>(); 
private Context mContext; 

public MyItemizedOverlay(Drawable defaultMarker) { 
    super(boundCenterBottom(defaultMarker)); 
} 

protected OverlayItem createItem(int i) { 
    return mOverlays.get(i); 
} 

public int size() { 
    return mOverlays.size(); 
} 

public void addOverlay(OverlayItem overlay) { 
    mOverlays.add(overlay); 
    populate(); 
} 
public void addOverlay(OverlayItem overlay,String permission) { 
    mOverlays.add(overlay); 
    permissions.add(permission); 
    populate(); 
} 

public MyItemizedOverlay(Drawable defaultMarker, Context context) { 
    //super(defaultMarker); 
    super(boundCenterBottom(defaultMarker)); 
    mContext = context; 
} 
public void clear() 
{ 
    mOverlays.clear(); 
    permissions.clear();//lista de permisos de cada usuario, ya que hay dos campos, el email (snippet) y el permission, una lista. 
} 

protected boolean onTap(int index) { 
    try{ 
    OverlayItem item = mOverlays.get(index); 
    if (permissions.size()==0) 
    {  
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
    dialog.setTitle(item.getTitle()); 
    dialog.setMessage(item.getSnippet()); 
    dialog.show(); 
    } 
    else 
    { 

    //set up dialog 
    Dialog dialog = new Dialog(mContext); 
    dialog.setContentView(R.layout.personal_dialog); 
    dialog.setTitle(item.getTitle()); 
    dialog.setCancelable(true); 
    //there are a lot of settings, for dialog, check them all out! 


    //set up text 
    TextView DialogEmail = (TextView) dialog.findViewById(R.id.DialogEmail); 
    TextView DialogPermission = (TextView) dialog.findViewById(R.id.DialogPermission); 
    DialogEmail.setText(item.getSnippet()); 
    DialogPermission.setText(permissions.get(index)); 

    final String userName=item.getTitle(); 
    final String email=item.getSnippet(); 
    final int cont=index; 
    //set up button 
    Button button = (Button) dialog.findViewById(R.id.DialogButton); 
    button.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //do something 
     Bundle bundle = new Bundle(); //bundle is like the letter 
     bundle.putString ("user",userName); //arg1 is the keyword of the txt, arg2 is the txt 
      bundle.putString ("email", email); 
      bundle.putString ("permission", permissions.get(cont)); 
      Intent i=null; 

      i = new Intent (MyItemizedOverlay.class, Locate.class); 

      i.putExtras(bundle); 
      startActivity(i); 
    } 
    }); 
    //now that the dialog is set up, it's time to show it  
    dialog.show(); 

    } 
    }catch(Exception e){} 
    return true; 
} 


} 

Répondre

4

Le Intent javadoc montrent clairement que la première arg doit être un contexte (étendu par l'activité) et la seconde la classe de l'activité que vous essayez de lancer. Dans votre cas, vous devez faire:

Intent intent = new Intent(mContext, AllActivity.class); 
mContext.startActivity(intent); 
+0

résolu! Merci beaucoup – NullPointerException

3

généralement, l'intention obtient dans l'un de son constructeur Context comme premier paramètre et une classe Activity comme le second. Alors, procédez comme suit:

Intent intent = new Intent(mContext, AllActivity.class); 
mContext.startActivity(intent); 
+0

cela fonctionne! mais maintenant j'ai un autre problème: S .... j'ai besoin de connaître les variables fullName, email et permission, pour lancer l'activité avec ce paquet, mais quand j'accède à ces variables quand le bouton est pressé, ces variables ne sont pas existe ... c'est logique, la valeur de ces variables est externe et est perte quand l'écouteur du bouton pressé est lancé ... Comment puis-je obtenir ces valeurs de variables sur l'écouteur du bouton? – NullPointerException

+1

ypu peut utiliser putExtra() et getExtras() pour votre intention. Mais il est préférable de marquer la réponse comme correcte et de poser une autre question ou de simplement rechercher la transmission de données entre les activités. –

+1

Ce n'est pas perdu. Utilisez 'MyItemizedOverlay.this.name' etc. – Falmarri

0

Pour un constructeur intention, il doit passer un Context du dossier de demande la mise en œuvre de cette classe, consultez this. ce n'est pas l'intention.
Il doit s'agir d'une activité, disons MyClass qui utilise votre classe MyItemizedOverlay. La meilleure chose à faire est de déclarer un staticContext dire myContext là et déclarer sa valeur comme myContext = MyClass.this; dans onCreate. Alors vous pouvez déclarer l'intention comme ceci

new Intent (MyClass.myContext , Locate.class);