tabhost studio que pestañas iconos example ejemplo con activity android android-activity android-tabhost

studio - tabs con iconos android



¿Cómo hacer referencia a la actividad infantil de TabHost para llamar a una función pública? (6)

Tengo un TabHost con dos actividades para niños en él (en dos pestañas). También implementé una función pública en una de estas actividades a la que me gustaría llamar desde mi padre (TabHost), para activar alguna acción dentro de la pestaña.

¿Es posible hacer referencia a la actividad desde el TabHost para llamar a una función pública?

Gracias

aquí está mi configuración de tabhost:

res = getResources(); tabHost = getTabHost(); TabHost.TabSpec spec; Intent intent; intent = new Intent().setClass(this, home.class); spec = tabHost.newTabSpec("home").setIndicator("Groups", res.getDrawable(R.drawable.groups)).setContent(intent); tabHost.addTab(spec); intent = new Intent().setClass(this, messages.class); spec = tabHost.newTabSpec("messages").setIndicator("Messages", res.getDrawable(R.drawable.messages)).setContent(intent); tabHost.addTab(spec);


Mi enfoque sería definir una clase ''listener'' anidada en la actividad secundaria que amplía BroadcastReceiver.

Simplemente transmitiría un Intento desde mi TabActivity que luego dispararía el BroadcastReceiver para realizar la acción.

EDITAR: Para dar un código de ejemplo ...

Los pasos son ...

  1. Definir el filtro de intención en el manifiesto
  2. Agregue el "oyente" anidado a la actividad del niño
  3. Establezca onResume () / onPause () en la actividad secundaria para registrar / anular el registro del oyente
  4. Cree intenciones en TabActivity y transmítalas cuando desee que el niño haga algo

En AndroidManifest.xml

<activity android:name=".MyActivity" android:label="@string/app_name" <intent-filter> <action android:name="com.mycompany.myApp.DO_SOMETHING" /> </intent-filter> </activity>

En MyActivity.java

public class MyActivity extends Activity { private MyListener listener = null; private Boolean MyListenerIsRegistered = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreated(savedInstanceState); listener = new MyListener(); } @Override protected void onResume() { super.onResume(); if (!MyListenerIsRegistered) { registerReceiver(listener, new IntentFilter("com.mycompany.myApp.DO_SOMETHING")); MyListenerIsRegisterd = true; } } @Override protected void onPause() { super.onPause(); if (MyListenerIsRegistered) { unregisterReceiver(listener); MyListenerIsRegistered = false; } } // Nested ''listener'' protected class MyListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // No need to check for the action unless the listener will // will handle more than one - let''s do it anyway if (intent.getAction().equals("com.mycompany.myApp.DO_SOMETHING")) { // Do something } } } }

En la TabActivity principal

private void MakeChildDoSomething() { Intent i = new Intent(); i.setAction("com.mycompany.myApp.DO_SOMETHING"); sendBroadcast(i); }


¡Gracias, esto me ayudó a resolver un problema similar!

Activity currentActivity = getLocalActivityManager().getActivity(_TabHost.getCurrentTabTag()); if(currentActivity != null && currentActivity instanceof iMyActivity) { // pass to children ((iMyActivity)currentActivity).onLaunchDelegate(); }


He encontrado otra solución, probablemente más simple. Estoy seguro de que OP ya no necesita esto, pero tal vez alguien del futuro estará encantado de encontrarlo.

Entonces, básicamente, para ejecutar un método público en su actividad secundaria, solo necesita este pequeño fragmento de código en su padre ( tabHost , home y message se toman de la configuración de OPHost de TabHost):

tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { @Override public void onTabChanged(String tabId) { Activity currentActivity = getCurrentActivity(); if (currentActivity instanceof home) { ((home) currentActivity).aPublicMethodFromClassHome(); } if (currentActivity instanceof messages) { ((messages) currentActivity).aPublicMethodFromClassMessages(); } } });

Lo uso en mi aplicación. Funciona como un encanto;)


Actualmente estoy depurando una aplicación de Android y encontré la misma necesidad. Encontré una respuesta muy directa a esto con este fragmento de código:

String currentActivityId = getLocalActivityManager().getCurrentId(); Activity currentActivity = getLocalActivityManager().getActivity(currentActivityId);

El identificador aquí es el identificador dado al crear el TabSpec:

tabHost.newTabSpec("id").setIndicator(indicator).setContent(intent);


encuentre simple, úselo en la aplicación clase ActivityTab:

if(getCurrentActivity() instanceof YourSearchActivity){ log("onClick: instance found"); ((YourSearchActivity)getCurrentActivity()).activityPublicFuntion(); }


Desde este enlace, encontré esta solución simple ( http://androidactivity.wordpress.com/2012/08/17/two-way-communication-between-tabactivity-and-its-child-tabs/ ):

Bueno, el truco es almacenar el TAG asociado con cada pestaña, y usarlo para llamar a la actividad respectiva.

Cuando crea la pestaña, la asocia con una etiqueta como la siguiente:

yourTabHost.newTabSpec("Tab1");

Digamos que queremos invocar un método "refreshContent ()" que está dentro de la Actividad Tab1.

Es simple llamar a estas líneas desde la actividad principal:

ActivityTab1 activity = (ActivityTab1) getLocalActivityManager().getActivity("Tab1"); activity.refreshContent();

¡Y eso es!

Ahora, en la dirección opuesta, queremos llamar a algún método "updateMain ()" dentro de MainActivity, desde la pestaña hija TabActivity1.

En TabActivity1 solo necesitarás llamar

((MainActivity)getParent()).updateMain();