Lanzamiento de actividades dentro de una pestaña en Android

Aquí está el trato. Tengo una aplicación con tres tabs. A través de varias interacciones con los elementos en las tabs, termino lanzando otras actividades. El cliente ha revisado esto y desea que las actividades se inicien “dentro” de las tabs, por lo que las tabs permanecen visibles y si el usuario hace clic en la pestaña vuelve a la actividad original definida en la función setContent. ¿Es esto posible y cómo lo haré con otras actividades? (es decir, las actividades del niño, no la que define el TabHost y tiene acceso a llamar a setContent)?

Es posible iniciar actividades dentro de tabs . Por lo tanto, establezca el contenido de la especificación tabs en un ActivityGroup en lugar de una actividad normal.

tabHost.addTab(tabHost.newTabSpec("Tab") .setIndicator("Tab") .setContent(new Intent(this, YourActivityGROUP.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))); 

Desde ese ActivityGroup puedes comenzar otra actividad como esta que solo actualiza la vista de contenido de la pestaña en la que te encuentras.

 class YourActivityGROUP extends ActivityGroup{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //you van get the local activitymanager to start the new activity View view = getLocalActivityManager() .startActivity("ReferenceName", new Intent(this,YourActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView(); this.setContentView(view); } } 

Aquí está mi solución

 public class ActivityStack extends ActivityGroup { private Stack stack; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (stack == null) stack = new Stack(); //start default activity push("FirstStackActivity", new Intent(this, FirstStackActivity.class)); } @Override public void finishFromChild(Activity child) { pop(); } @Override public void onBackPressed() { pop(); } public void push(String id, Intent intent) { Window window = getLocalActivityManager().startActivity(id, intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); if (window != null) { stack.push(id); setContentView(window.getDecorView()); } } public void pop() { if (stack.size() == 1) finish(); LocalActivityManager manager = getLocalActivityManager(); manager.destroyActivity(stack.pop(), true); if (stack.size() > 0) { Intent lastIntent = manager.getActivity(stack.peek()).getIntent(); Window newWindow = manager.startActivity(stack.peek(), lastIntent); setContentView(newWindow.getDecorView()); } } } 

Pestaña de inicio

 Intent intent = new Intent().setClass(this, ActivityStack.class); TabHost.TabSpec spec = tabHost.newTabSpec("tabId") spec.setContent(intent); 

Llamar a la siguiente actividad

 public class FirstStackActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("First Stack Activity "); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getParent(), SecondStackActivity .class); ActivityStack activityStack = (ActivityStack) getParent(); activityStack.push("SecondStackActivity", intent); } }); setContentView(textView); } } 

Llamar al siguiente nuevamente

 public class SecondStackActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("First Stack Activity "); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getParent(), ThirdStackActivity .class); ActivityStack activityStack = (ActivityStack) getParent(); activityStack.push("ThirdStackActivity", intent); } }); setContentView(textView); } } 

Funciona en el emulador 2.2

Lo resolví con esto: Experiencia – Múltiples actividades de Android en una TabActividad

puedes usar

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

para cada actividad que establezca como contenido para tabSpec, y creará esta actividad cada vez que presione en la pestaña

commonsware.com es correcto, no es posible. Tuve un problema similar, pero solo se lanzó una actividad. Sacrifiqué un poco de mi architecture y eliminé la actividad que se lanzó desde el interior de la pestaña. Puse el código en una Vista y luego agregué un ViewAnimator a la actividad de la pestaña. Anulo el botón Atrás y elimino esa vista si está arriba, o de lo contrario dejo que el botón Atrás funcione normalmente.

Esto lo fingió bastante bien, y por solo 1 actividad estrechamente relacionada, no voy a perder el sueño por las consideraciones de diseño.

¿Qué tal 2 tabbar en este problema? Primero 1 es tabbar inferior del menú, segundo es tabbar superior, son actividad diferente y xml

¿Como puedo abrir un fragmento o actividad desde un spinner en la barra de herramientas?

 import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; > public class MainActivity extends AppCompatActivity { > > @Override > protected void onCreate(Bundle savedInstanceState) { > super.onCreate(savedInstanceState); > setContentView(R.layout.activity_main); > > //Appbar > Toolbar toolbar = (Toolbar) findViewById(R.id.appbar); > setSupportActionBar(toolbar); > getSupportActionBar().setDisplayShowTitleEnabled(false); > > //Appbar page filter > Spinner cmbToolbar = (Spinner) findViewById(R.id.CmbToolbar); > > ArrayAdapter adapter = new ArrayAdapter<>( > getSupportActionBar().getThemedContext(), > R.layout.appbar_filter_title, > new String[]{"Opción 1 ", "Opción 2 ", "Opción 3 "}); > > adapter.setDropDownViewResource(R.layout.appbar_filter_list); > > cmbToolbar.setAdapter(adapter); > > cmbToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { > @Override > public void onItemSelected(AdapterView adapterView, View view, int position, long l) { > //... Acciones al seleccionar una opción de la lista > Log.i("Toolbar 3", "Seleccionada opción " + position); > > Fragment f = null; > > switch(position) { > case 0: > f = Fragment2.newInstance(); > break; > > case 1: > f = Fragment1.newInstance(); > break; > > } > } > > @Override > public void onNothingSelected(AdapterView adapterView) { > //... Acciones al no existir ningún elemento seleccionado > } > }); > } > > @Override > public boolean onCreateOptionsMenu(Menu menu) { > // Inflate the menu; this adds items to the action bar if it is present. > getMenuInflater().inflate(R.menu.menu_main, menu); > return true; > } > > @Override > public boolean onOptionsItemSelected(MenuItem item) { > // Handle action bar item clicks here. The action bar will > // automatically handle clicks on the Home/Up button, so long > // as you specify a parent activity in AndroidManifest.xml. > int position = item.getItemId(); > > Fragment f = null; > > switch(position) { > case 0: > f = Fragment2.newInstance(); > break; > > case 1: > f = Fragment1.newInstance(); > break; > > case 2: > Intent intent = new Intent(getApplicationContext(), Fragment1.class); > startActivity(intent); > break; > > } > return super.onOptionsItemSelected(item); > } > > > public Fragment getItem(int position) { > > Fragment f = null; > > switch(position) { > case 0: > f = Fragment2.newInstance(); > break; > > case 1: > f = Fragment1.newInstance(); > break; > > case 2: > Intent intent = new Intent(getApplicationContext(), Fragment1.class); > startActivity(intent); > break; > > } > > return f; > } }