2011-03-16 20 views
7

Tengo un tabhost con tres pestañas. Cada uno es una actividad Me gustaría tener un botón que está en la barra de acción, la barra en la parte superior con botones comunes, funciones de llamada de la pestaña que está activa.Android: Cómo llamar a la función de actividad dentro de la pestaña desde el tabhost

Por ejemplo, una función de suma que podría añadir algo diferente para cada pestaña en función de lo pestaña estaba presente cuando se hace clic en el botón.

lo tanto, estoy aksing cómo llamar a una función en la actividad A de la tabHost.

Y si eso no funcionará, tal vez pueda actualizar la base de datos de la tabhost y luego actualizar el contenido pestaña. ¿Sería eso más fácil?

Gracias a todos por su tiempo y apoyo.

Respuesta

7

Hola Acabo de tropezar con esto, no estoy seguro si ya encontraste una solución?

Lo resolví recientemente. Anteriormente, estaba solucionando el problema al generar una transmisión intencionada desde la actividad de tabhost y recibir la transmisión dentro de la actividad de la pestaña secundaria. Esto funcionó para mí, pero estaba seguro de que hay una "mejor" manera.

una forma más limpia es lograr que con algo como esto:

podría tener algo como esto:

  • parentActivity - mi "contenedor" actividad que mantiene el TabHost
  • childActivity - mi actividad de pestaña que contiene contenido de pestañas y el método público al que quiero llamar desde parentActivity

dentro ParentActivity:

// a method used for onclick callback or whatever you need. within parentActivity (tabhost) 
// this will get call huzzah() in the first tab - getChildAt(0) 
onClick() { 
    childActivity childAct = (childActivity) getTabHost().getChildAt(0).getContext(); 
    childAct.huzzah(); 
} 

dentro childActivity:

// a public method for the parent activity to access 
public void huzzah() { 
    Log.d("stuff", "huzzah() called"); 
} 

Nota: Otra alternativa que creo es que rediseñar utilizar puntos de vista en lugar de las actividades en las pestañas. Esta es una mejor alternativa en general porque la memoria IIRC sabia que solamente están almacenando 1 actividad en la pila en lugar de (n * tabs) número de actividades

Espero que ayude

+1

Hola, wired00, intenté implementar esta solución pero recibo una ClassCastException. Básicamente, he copiado tu código, pero aquí hay una copia mía por si acaso: \t \t \t SearchActivity childAct = (SearchActivity) getTabHost(). GetChildAt (0) .getContext(); \t \t \t childAct.changeStateTo (1); En este código, SearchActivity es el nombre de la clase y changeStateTo() es el método público al que se llama. ¿Alguna ayuda? – Rockmaninoff

+1

onClick es un código incorrecto. Devolver ninguna actividad secundaria, pero vista secundaria de tabhost - LinearLayout –

+0

Hola, @Rockmaninoff, estoy enfrentando el mismo problema. ¿Has encontrado alguna solución? –

13

He utilizado el siguiente código dentro de mi TabActivity clase a pestaña del interruptor y luego llamar a un método público se define en la actividad de la ficha:

getTabHost().setCurrentTab(0); 
Activity MyActivity = this.getCurrentActivity(); 
MyActivity.myMethod(); 

suerte útil para alguien que busca la respuesta a esta pregunta.

+0

Gracias, intentaré que la próxima vez ... – trgraglia

+1

esto funcionó como un encanto :) el otro me dio esa claseCastException ... – codemonkeybr

+0

@dan k: hola Creo 3 intenciones de actividades (que agrego a TabHost) en mi TabActivity principal. También tengo actualización en el diseño de tabhost, al hacer clic en este botón de actualización quiero actualizar la lista de actividad de actividad/actividad de pestaña actual, normalmente el método público se llama como dijiste, pero en otro caso muestra un problema de conexión ... cualquier idea sobre ¿esta? – CoDe

0

Editado según la petición Peter O:

estoy de API 10, y este problema me dio un dolor de cabeza enorme. Tengo 3 pestañas, quiero que todos ellos estén al tanto de los cambios en el otro.El problema que tenía era que una vez que se iniciaba la actividad de una pestaña, parecía que no había devolución de llamada, por lo que la actividad entendía que el usuario cambiaba a una pestaña diferente y, por lo tanto, necesitaba trabajar para asegurarse de que su estado era correcto.

Encontré muchas respuestas a este problema, pero ninguna parecía funcionar.

El que finalmente llegué a trabajar fue la solución ofrecida como # 3 para este hilo, pero también es confuso. Encontré que getTabHost(). SetCurrentTab (0); no hace nada; Implementé OnTabChangeListener() para llamar a una función que usa getTabHost(). SetCurrentTab (0); sin embargo, encontré el getTabHost(). setCurrentTab (0); hizo que la aplicación fallara para cualquier pestaña que no sea 0, por ejemplo, si elijo la pestaña B (índice = 1), entonces se llama a getTabHost(). setCurrentTab (1); la aplicación se colgó.

Usando el depurador, encontré la llamada this.getCurrentActivity(); siempre devuelve la actividad asociada a la pestaña en la que el usuario hizo clic: llamando a getTabHost(). setCurrentTab(); no cambió ese hecho y causó que la aplicación fallara.

Así que me deshice de él y ahora puedo llamar a this.getCurrentActivity(), luego invoco un método en la clase Actvitity devuelta por esa llamada, esto le permite a la actividad saber que tiene que actualizar su estado, en mi caso lo hace usando el objeto de la aplicación.

+1

Esta respuesta es un poco confusa. ¿Puede por favor formatearlo y editarlo para que quede solo como una respuesta mejor? Por ejemplo, ¿qué es "el código anterior"? (Las respuestas se pueden ordenar en un orden diferente, por lo que referirse a una respuesta "arriba" puede ser incorrecto.) –

+0

Estoy de acuerdo con Peter. Bienvenido a SO Derwood y gracias por responder, pero aprender a formatear te ayudará a ser más aceptado y a obtener mejores comentarios. En cuanto a los errores en las pestañas que no sean 0 ... Suena como si algo más estuviera causando el error. – trgraglia

0

La forma anterior de una llamada al método no funcionará,

Aquí está la respuesta rápida para el problema anterior:

getTabHost().setCurrentTab(0);

Activity myActivity=getCurrentActivity();

String name=((Tab1) myActivity).et1.getText().toString();

Aquí el el código anterior se da en el método onclick() de la actividad que tiene TahHost donde Tab1 es la actividad secundaria y et1 es la identidad del texto de edición en la actividad de Tab1 para que pueda obtener todo el valor de los diferentes campos como este individualmente.

Cuestiones relacionadas