¿Como modificar un textview por settext de una clase en otra clase externa?

1,689 views
Skip to first unread message

fernandosg

unread,
Nov 19, 2012, 10:32:14 PM11/19/12
to android...@googlegroups.com
Hola a todos, disculpen si el titulo les parece algo confuso, les explico lo que quiero saber.
Estoy trabajando para un cliente una aplicacion en Android con Google Maps.
Uno de los modulos, debera de mostrar un mapa, con un marker, al hacerle clic al marker, en la parte superior del mapa, debera de aparecer modificando unos campos(en este codigo que pondre, solo es un textview) el titulo e informacion extra.
Para manejar los eventos al hacer clic usare una clase que ya viene en varios tutoriales, MyItemizedOverlay , y otra clase donde se va a mostrar el mapa, mapatest:


-------------------------------------MAPATEST-------------------------------------

package com.func.app;

import java.util.List;

import com.func.app.R;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;


import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.EditText;
import android.widget.TextView;


public class mapatest extends MapActivity {
    private MapView mapView;
    public static List<Overlay> mapOverlays;
    GeoPoint point,point2;
    OverlayItem overlayitem,overlayitem1;
    public TextView titulo;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mapa);
        titulo=(TextView)findViewById(R.id.tituloanuncio);
        //titulo.setText("a ver");
        //comunica();
        mapView = (MapView) findViewById(R.id.map_view);
         //sets the zoom to see the location closer
        mapView.getController().setZoom(12);
 
        //this will let you to zoom in or out using the controllers
        mapView.setBuiltInZoomControls(true);
 
        List< Overlay > mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.googleicon);
        
        MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(drawable, this);
 
        GeoPoint point = new GeoPoint(46066940, 23570000);
       //this will show you the map at the exact location you want (if you not set this you will see the map somewhere in America)
        mapView.getController().setCenter(point);
        OverlayItem overlayitem = new OverlayItem(point, "Title for dialog", "Alba Iulia City From Romania");
 
        GeoPoint point2 = new GeoPoint(35410000, 139460000);
        OverlayItem overlayitem2 = new OverlayItem(point2, "Title for dialog", "Japan");
 
        itemizedoverlay.addOverlay(overlayitem);
        itemizedoverlay.addOverlay(overlayitem2);       
        mapOverlays.add(itemizedoverlay);
       
    }
   
    @Override
    protected boolean isRouteDisplayed() {
          return false;
    }
   
    void comunica(){
            this.titulo.setText("titulos");
       
        System.out.println("Comunicando");
    }
   

}
-------------------------------------------MyItemizedOverlay---------------------------------------

package com.func.app;

import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
 
import java.util.ArrayList;
 
/**
 * Description
 *
 * @author : kazy
 *         Date: 3/23/12
 */
public class MyItemizedOverlay extends ItemizedOverlay {
    private ArrayList< OverlayItem > mOverlays = new ArrayList< OverlayItem >();
    Context mContext;
 
 
 
    public MyItemizedOverlay(Drawable marker) {
        super(boundCenterBottom(marker));
    }
 
    public MyItemizedOverlay(Drawable marker, Context context) {
        super(boundCenterBottom(marker));
        mContext = context;
    }
 
    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }
 
    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }
 
    @Override
    public int size() {
        return mOverlays.size();
    }
 
    @Override
    protected boolean onTap(int i) {     
        mapatest ob=new mapatest();//Prueba nivel noob
        ob.comunica();//Pruebas nivel noob
        return true;
    }
}

------------------------------------------------------------------------------------
Lo que yo tenia pensado era crear un metodo en mapatest comunica(como viene en el codigo),donde en ese codigo se modifica por settext, y en el metodo onTap de MyItemizedOverlay llamarlo para que al hacer clic se muestre la informacion en un textview, para probar hice un objeto de la clase mapatest y lo ejecute en onTap, obviamente no funciona, por lo que vengo aca con la duda ¿como puedo modificar desde onTap el textview de mapatest? Pense en esa solucion, pero si no es en onTap, corrijanme por favor,les agradezco a todos por leer el mensaje..
Saludos


jlmo...@gmail.com

unread,
Nov 20, 2012, 3:27:38 AM11/20/12
to android...@googlegroups.com
Una manera rapida de hacerlo es que añadas el textview a la clase y en el constructor del MyItemizedOverlay con lo que te quedaría así:

private TextView mTitulo;
 public MyItemizedOverlay(Drawable marker, Context context, TextView titulo) {
        super(boundCenterBottom(marker));
        mContext = context;
        mTitulo = titulo;
    }

Y luego en el onTap accedes directamente a mTitulo para poner ahí lo que quieras.

La linea en la que instancias el MyItemizedOverlay en tu mapActivity quedaría así:

MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(drawable, this, titulo);

Saludos!


2012/11/20 fernandosg <angel...@gmail.com>

Jc Miñarro

unread,
Nov 20, 2012, 3:42:00 AM11/20/12
to android...@googlegroups.com
Creo que no haría falta pasarle el TextView también al constructor, ya que como le estás
pasando una instancia de la clase con el context, simplemente lo que tendrías que hacer
es hacerle un casting a ese context a la clase testmap y llamar al metodo comunica();
Otra cosa que podrías hacer es declarar la clase privada y en ese caso puedes acceder
a los metodos/atributos de la otra clase.
--
Un saludo,
Jc Miñarro

-------------------------------------------------------------------------------------------
CarteleraApp - Consulta la cartelera y estrenos de los cines españoles.

Fernando F. Gallego

unread,
Nov 20, 2012, 3:42:26 AM11/20/12
to android...@googlegroups.com
Si tu clase MyItemizedOverlay es una clase dentro de la misma actividad, te puedes crear un método público que sea changeTitle(String title) que cambie el text view, luego en el onTap simplemente llamas a changeTitle(elTituloQueQuieras), pero es posible que el mapa corra en otro hilo por lo que no puedas cambiar un view desde ese hilo, para eso puedes llamarlo desde un runnable llamando a runOnUiTread asi:

protected boolean onTap(int index) {
    final String titulo = "titulo";
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
           setText(titulo)
          }
    }
}

Si lo tienes en otra clase externa, yo le pasaría un handler en vez del TextView y enviaría un mensaje al handler desde el onTap para que lo reciba el mapactivity y cambiar el texto

El 20 de noviembre de 2012 09:27, jlmo...@gmail.com <jlmo...@gmail.com> escribió:

fernandosg

unread,
Nov 25, 2012, 2:39:04 PM11/25/12
to android...@googlegroups.com
Muchas gracias a todos, una solucion tambien que encontre en estar probando, fue el de crear el textview de manera estatica en la clase mapatest y crear un metodo que retorne el textview para modificarlo en la clase myitemizedoverlay.

Ya tenia pensado esa idea, pero no se que tan bueno sea en rendimiento, o si no tiene nada que ver, ya que muy pocas veces he ocupado variables estaticas.
Saludos

Fernando F. Gallego

unread,
Nov 26, 2012, 3:40:28 AM11/26/12
to android...@googlegroups.com
En principio es mala idea poner views en variables estáticas, ya que tienen una referencia al contexto de la actividad y puedes tener memory leaks porque al mantener la referencia el objeto de la actividad, ésta no se puede liberar de la memoria.

Saludos.
Reply all
Reply to author
Forward
0 new messages