Autore Topic: aiuto per gestire mapoverlay onTap event.  (Letto 707 volte)

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
aiuto per gestire mapoverlay onTap event.
« il: 06 Febbraio 2012, 19:33:09 CET »
0
ciao Ragazzi.
Ho creato una applicazione che usa il mapview e gli overlay come indicato su:
http://developer.android.com/resources/tutorials/views/hello-mapview.html
l'applicazione ha due activity,la principale con la mapview e una secondaria che gestisce un form dove immetto degli attributi per l'overlay che salvo in un db sqlite quando si clicca su un punto della mappa,e tutto funziona bene.
Adesso vorrei fare che quando clicco sull overlay possa se voglio modificare i dati che gli corrispondono o cancellarlo.
nell'evento Ontap della classe HelloItemizedOverlay ho inserito il seguente codice che gestisce un alert dialog:

Codice (Java): [Seleziona]
                final String[] options = { "Edit", "remove" };
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("Cosa vorresti?");
                builder.setSingleChoiceItems(options, 2, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                String option = options[which];
                        }
                });
                builder.setCancelable(false);
                builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                // gestione evento edit o Remove
                        }
                });
                builder.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                //gestione evento annulla
                                                          //solo chiuderá la finestra di dialogo
                        }
                });
                AlertDialog alert = builder.create();
                return alert;
        }

Quando premo sull'overlay si visualizza correttamente la dialog box, ma no riesco a capire come fare in modo que mi si apra la seconda activity per la modifica dei dati.
Ho provato con il metodo dell intent, ma nella classe HelloItemizedOverlay, non riesco a gestire il metodo onactivityresult.
Mi potete aiutare??
grazie.
« Ultima modifica: 07 Febbraio 2012, 16:40:13 CET da fieraf »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #1 il: 07 Febbraio 2012, 09:48:46 CET »
0
Se fai startActivityForResult, una volta terminata la seconda activity, verrà richiamato l'onActivityResult dell'activity con il context cui cui l'hai richiamata. Questi metodi fanno parte della classe Activity e relative sottoclassi (MapActivity, ListActivity...), e la classe ItemizedOverlay non ha a che fare con queste. :)
Ti basta creare un metodo nell'itemizedoverlay per gestire i nuovi dati e richiamarlo nell'onactivityresult.

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #2 il: 07 Febbraio 2012, 10:00:30 CET »
0
Ciao,grazie per la ripsota, ma mi puoi spiegare meglio cosa doveri fare?
dalla prima alla seconda activity passo dati senza problemi, e riescoa gestirli con i metodi startActivityForResult e onActivityResult.
il problema sta proprio in quelolo che dici tu per la classe ItemizedOverlay.
che metodi devo implementare in questa classe?
questo é il codice nell onActivityResult della prima activity dove ho il mapview e creo l'overlay dai dati provenienti dalla seconda activity che li mette in un db
Codice (Java): [Seleziona]
        if(requestCode == REQ_CODE){
                        if (resultCode == RESULT_OK){
                                Double longit,latit;
                                DBHelper = new DatabaseHelper(this,DBName);
                        db=DBHelper.getReadableDatabase();
                        Cursor cursor=db.query("Tabla1",null,null,null,null,null,null);
                       //Toast.makeText(this, DBName, Toast.LENGTH_LONG).show();
                       cursor.moveToLast();
                       // cursor.moveToFirst();
                                        latit= Double.parseDouble(cursor.getString(cursor.getColumnIndex("Lat")))  ;
                                        longit=  Double.parseDouble(cursor.getString(cursor.getColumnIndex("Lon")));
                                        //Toast.makeText(this,(int) (latit*1E6) +"\n"+(int) (longit*1E6), Toast.LENGTH_LONG).show();
                                        marker = new GeoPoint((int) (latit*1E6) ,(int) (longit*1E6));
                                        SelezionaImg(Integer.parseInt(cursor.getString(cursor.getColumnIndex("Simbolo"))));
                                        creapunto( PosImg,marker, String.valueOf(latit), String.valueOf(longit));
                            cursor.close();
                            db.close();
                        }else if(resultCode == RESULT_CANCELED){
                               
                        }
                }
mi aiuti?

grazie.
« Ultima modifica: 07 Febbraio 2012, 10:05:15 CET da fieraf »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #3 il: 07 Febbraio 2012, 10:59:48 CET »
0
Forse non ho capito molto io cosa vuoi fare e non ti riesce.  :D
Non sai come richiamare lo startActivity nell'itemizedOverlay?

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #4 il: 07 Febbraio 2012, 11:24:02 CET »
0
Allora riepilogo.
quando tocco l'overlay, si attiva il metodo OnTap della classe itemizedOverlay che mi mostra la finestra di dialogo con le sclete Edit o Remove.
Quello che vorrei fare é una delle due seguenti possibilita:
1- una volta falta la scelta e premuto Ok apro direttamente la activity dove inserisco i dati pasandogli per esempio una stringa che contenga edit o remove, per far in modo che in quest'ultima activity possa aggiornare o rimuovere il record corrispondente a l'overlay toccato.

2- giá che una volta falta la scelta Edit o Remove sto ancora nella prima activity, posso richiamare da li la seconda activity con la stessa metodologia dell'opzione 1

spero di essermi spiegato bene.

grazie.

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #5 il: 07 Febbraio 2012, 11:34:45 CET »
0
Ok, ma non capisco il problema. :)
Se il tuo problema è far partire l'activity dal dialog dell'itemizedOverlay, aggiungi l'activity di partenza nel costruttore della tua classe itemizedOverlay e la salvi in una variabile, così puoi richiamare activity.startActivityForResult().

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #6 il: 07 Febbraio 2012, 11:43:38 CET »
0
il problema principale é che  sono nuovo di java e android,mea culpa,provengo dal .net.
puoi farmi un esempio di come fare quello che mi dici?

nel frattempo avevo pensato di creare un file di appoggio nell evento tap  e poi leggere questo quando ritorno alla prima activity, ma sembra che una volta chiusa la finestra di dialogo non ritorno nell'evento resume della prima activity.

vorrei peró percorrere la strada che tu mi dici per imparare cose nuove e scrivere un codice piú elegante.

grazie

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #7 il: 07 Febbraio 2012, 11:46:03 CET »
0
Prova a postare la parte del costruttore della classe itemizedOverlay. :)

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #8 il: 07 Febbraio 2012, 11:51:01 CET »
0
questa é tutta la classe itemizedOverlay.
Devo per caso fare qualcosa tipo:mContext.startActivity(intent)..?
 
Codice (Java): [Seleziona]
package miaapp.android;

import java.util.ArrayList;

//import android.app.AlertDialog;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

@SuppressWarnings("rawtypes")
public class HelloItemizedOverlay extends ItemizedOverlay {
        private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
        public String  option;
        Context mContext;
        public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
                super(boundCenterBottom(defaultMarker));
                 mContext = context;
                // TODO Auto-generated constructor stub
        }

        @Override
        protected OverlayItem createItem(int i) {
                // TODO Auto-generated method stub
                return mOverlays.get(i);
        }

        @Override
        public int size() {
                // TODO Auto-generated method stub
                return mOverlays.size();
        }
       
        public void addOverlay(OverlayItem overlay) {
                mOverlays.add(overlay);
                populate();
        }
       


        @Override
        protected boolean onTap(int index) {
                OverlayItem item = mOverlays.get(index);
                AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
                dialog.setTitle(item.getTitle());
        final String[] options = { "Edit", "Remove" };
        dialog.setTitle("Cosa vorresti?");
        dialog.setSingleChoiceItems(options, 2, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                         option = options[which];
                }
        });
        dialog.setCancelable(false);
        dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                        // gestione evento edit o Remove
                        dialog.dismiss();
                       
                }
        });
        dialog.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                        //gestione evento annulla
                        //solo chiuderá la finestra di dialogo
                        option="Annulla";
                        dialog.dismiss();
                }
        });
       // AlertDialog alert = dialog.create();
        //return alert;        
                //dialog.setMessage(item.getSnippet());
                dialog.show();
                return true;
        }
}

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #9 il: 07 Febbraio 2012, 12:01:58 CET »
0
Dovresti cambiare in:
Codice (Java): [Seleziona]
  Activity mActivity;
        //Questo è il costruttore della classe
        public HelloItemizedOverlay(Drawable defaultMarker, Activity activity) {
                super(boundCenterBottom(defaultMarker));
                 mActivity = activity;
                // TODO Auto-generated constructor stub
        }
Puoi usare tranquillamente l'activity dove prima usavi il context, perché la prima è una sottoclasse (indiretta) della classe Context.
In questo modo puoi richiamare il metodo startActivityForResult() nel listener del dialog. Ti serve l'activity perché il context ha solo il metodo startActivity e manca dello startActivityForResult.

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #10 il: 07 Febbraio 2012, 12:05:59 CET »
0
ok, provo e ti faccio sapere

Offline fieraf

  • Utente junior
  • **
  • Post: 88
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s 2
  • Sistema operativo:
    windows 7
Re:aiuto per gestire mapoverlay onTap event.
« Risposta #11 il: 07 Febbraio 2012, 16:40:02 CET »
0
Tutto risolto :-)
ho usato quello che mi hai consigliato,ho fatto le prove anche con il context e tutto ok, perché alla fine non mi é servito controllare nulla su onresultactivity della prima activity.
Ho imparato un'altra cosa.
mille grazie.
evviva i forum.