Android – Tabs, MapView, actividades dentro de las pestañas

Estamos en el proceso de escribir una aplicación que tiene 4 pestañas: Mapa, Personas, Lugares, Eventos. Las personas, lugares y eventos de la aplicación aparecen como iconos en el mapa. De forma predeterminada, las pestañas Personas, Lugares y Eventos muestran una vista de lista, renderizado personalizado, que muestra todas las Personas, Lugares y Eventos respectivamente.

Alt text http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png

Ahora, ahora mismo cada una de las pestañas tiene como contenido un conjunto de intenciones para iniciar la actividad correspondiente. Por ejemplo, hay un MapTabActivity que extiende MapActivity, un ShowPeopleListActivity que muestra a la gente, y así sucesivamente y así sucesivamente.

Veo muchas preguntas / respuestas de StackOverflow diciendo que debido a varias limitaciones en la forma en que está configurado TabHost, es mejor NO usar actividades como el contenido de las pestañas. Por ejemplo, es imposible iniciar una nueva actividad y hacer que ocupe el lugar de la actividad existente dentro de una pestaña, mientras que es posible cambiar una vista con una vista diferente.

Ahora, estoy en una encrucijada. Hemos dedicado una buena cantidad de tiempo (para bien o para mal) a que esta aplicación funcione de la forma en que está estructurada actualmente, con las Actividades como contenido de las pestañas. Cuando se hace clic en un ícono correspondiente a una persona, lugar o evento, se activa una intención VIEW en un URI correspondiente a ese objeto; Esto es recogido por una actividad que luego muestra el objeto. El mismo mecanismo está funcionando tanto en el Mapa como en las listas individuales. Nos gusta mucho el acoplamiento suelto que nos proporciona; Solo damos un comando VIEW y el URI a la persona / lugar / evento y automáticamente nos lleva a la actividad correcta. Por supuesto, la actividad que se lanzó cubre la vista de pestañas en lugar de aparecer dentro de eso, pero estábamos dispuestos a vivir con esto.

Aquí hay un problema: a partir de la actividad Mostrar, queremos poder volver al mapa, centrado en esa persona, lugar o evento. Podemos iniciar una nueva actividad para volver a mostrar el mapa, pero ahora tenemos la actividad del mapa como el contenido de la pestaña, además de la actividad del espectáculo, además de la nueva actividad del mapa en la pila de actividades; Dado el uso intensivo de recursos de la actividad de mapa, supongo que esto no es el camino ideal para ir.

Supongo que mi pregunta es, ¿hay un buen tutorial en algún lugar que muestra exactamente cómo hacer tareas complejas con un TabHost? He visto HelloTabWidget ; Estoy buscando algo mucho más sofisticado que esto. Me preocupa que si cambiamos a la forma de hacer las cosas con base en View, tendremos que hacer un montón de tareas domésticas para interceptar todos los eventos posteriores, tratar de cambiar las vistas, etc., etc., así como Uniendo fuertemente nuestro programa de una manera que no queremos.

Cualquier sugerencia sobre un camino a seguir sería muy apreciada. Somos nuevos en Android por lo que estamos tratando de seguir las mejores prácticas establecidas, pero es difícil cuando los pocos ejemplos que hemos visto son demasiado simplistas para nuestro caso de uso.

Veo muchas preguntas / respuestas de StackOverflow diciendo que debido a varias limitaciones en la forma en que está configurado TabHost, es mejor NO usar actividades como el contenido de las pestañas.

Como auto-nombrado Presidente de la Anti-Actividad-Tab Alliance (AATA), esa es ciertamente mi posición.

Cuando se hace clic en un ícono correspondiente a una persona, lugar o evento, se activa una intención VIEW en un URI correspondiente a ese objeto; Esto es recogido por una actividad que luego muestra el objeto.

Tenga en cuenta que esto no tiene nada que ver con tener actividades como el contenido de las pestañas.

Podemos iniciar una nueva actividad para volver a mostrar el mapa, pero ahora tenemos la actividad del mapa como el contenido de la pestaña, además de la actividad del espectáculo, además de la nueva actividad del mapa en la pila de actividades; Dado el uso intensivo de recursos de la actividad de mapa, supongo que esto no es el camino ideal para ir.

Lo evitaría si fuera posible.

Me preocupa que si cambiamos a la forma de hacer las cosas con base en View, tendremos que hacer un montón de tareas domésticas para interceptar todos los eventos posteriores, tratar de cambiar las vistas, etc., etc., así como Uniendo fuertemente nuestro programa de una manera que no queremos.

Esto no se sigue en absoluto de lo que escribió anteriormente. Sus "eventos posteriores" no cambiarán un iota entre el uso de Vistas como el contenido de las pestañas y el uso de Actividades como el contenido de las pestañas. Además, esto no tiene nada que ver con el patrón de "acoplamiento suelto" que describe – al hacer clic en un icono en una lista en una vista de una pestaña no es diferente de hacer clic en un icono de una lista en una vista de una actividad en una pestaña.

Simplemente haga que su actividad Show muestre su actividad principal para mostrar una ubicación en particular, entonces la actividad Show puede finish() . La forma más sencilla de hacerlo sin introducir un acoplamiento JVM duro entre las actividades es difundir un Intent y registrar un BroadcastReceiver en la actividad principal. Al recibir este Intent , la actividad principal actualizaría el mapa y lo establecería como la pestaña actual. Por supuesto, este enfoque es más sencillo si la actividad principal usa Vistas para su contenido de pestaña.

Ahora, si intenta revisar su aplicación, de modo que navegar en una pestaña no inicie otra actividad, sino que mantenga las cosas dentro de su propia pestaña … es decir, una "marmita de pescado entero".

Es una buena práctica tener una actividad y varias vistas para las pestañas. Sin embargo, eso significa que hay que tener cuidado de manejar qué pestaña está seleccionada, diferentes menús y menús contextuales para cada vista de pestaña, etc.

Supongo que mi pregunta es, ¿hay un buen tutorial en algún lugar que muestra exactamente cómo hacer tareas complejas con un TabHost? He visto HelloTabWidget; Estoy buscando algo mucho más sofisticado que esto.

Escribí un tutorial un poco mejor en mi blog que demuestra una interacción ListView y MapView como pestañas. Aquí está el enlace: Tabulaciones de Android con mapas interactivos y vistas de lista

Lo básico es tener un diseño similar al del tutorial HelloTabWidget, hacer que su actividad se extienda desde MapActivity, extraer el tabhost del XML y asegurarse de llamar a setup () en el tabhost. Después de eso, agregar vistas como el contenido de las pestañas, los oyentes de pestañas, etc. son los mismos.

Aquí hay un breve punto de partida para la clase:

 public class TabbedListMapActivity extends MapActivity { private ListView listView; private MapView mapView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tabHost = (TabHost) findViewById(android.R.id.tabhost); // setup must be called if not a TabActivity tabHost.setup(); // setup list view listView = (ListView) findViewById(R.id.list); // setup map view mapView = (MapView) findViewById(R.id.mapview); // add views to tab host tabHost.addTab(tabHost.newTabSpec("List").setIndicator("List").setContent(new TabContentFactory() { public View createTabContent(String arg0) { return listView; } })); tabHost.addTab(tabHost.newTabSpec("Map").setIndicator("Map").setContent(new TabContentFactory() { public View createTabContent(String arg0) { return mapView; } })); } 

Por ejemplo, es imposible iniciar una nueva actividad y hacer que ocupe el lugar de la actividad existente dentro de una pestaña, mientras que es posible cambiar una vista con una vista diferente.

No creo que sea imposible. Experimenté con esta idea y escribí un artículo de blog explicando lo que hice. Incluyo un proyecto de código de ejemplo al final del artículo que demuestra algunas de las cosas interesantes que aprendí.

  • ¿Cómo puedo obtener un contenido de recursos desde un contexto estático?
  • ¿Qué es getSeekableFileDescriptor () en este documento android?
  • IntelliJ IDEA IDE para el desarrollo de Android
  • Cómo desarrollar la barra de estado personalizado en android JellyBean 4.2.2
  • Argumentos / variables personalizados pasados ​​al emulador de Android
  • Cómo quitar todas las devoluciones de llamada de un controlador?
  • Conflicto con el paquete Android - Amazon SNS
  • Android Paint: cómo obtener efecto "aerógrafo"?
  • Integra la aplicación con el sitio web social de primavera
  • Android M permiso de la prueba READ_PHONE_STATE (permisos peligrosos)
  • Array de escritura en Firebase android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.