Lanzamiento de actividades dentro de una pestaña en Android
Aquí está el trato. Tengo una aplicación con tres pestañas. A través de varias interacciones con los ítems de las pestañas acabo lanzando otras actividades. El cliente ha revisado esto y desea que las actividades se inicien dentro de las pestañas, por lo que las pestañas permanecen visibles y si el usuario hace clic en la pestaña, regresa a la actividad original definida en la función setContent. ¿Es esto posible y cómo voy a ir sobre esto de otras actividades? (Es decir, las actividades del niño, no la que define el TabHost y tiene acceso a la llamada setContent)?
- ¿Qué es diferente de putSerializable y putParcelable en Java?
- HttpClientBuilder falta en Android?
- Cancelación automática de la notificación en un momento determinado
- ZXing Lector de código de barras: ¿Cómo hacer frontera personalizada alrededor de la pantalla de captura?
- Lectura rápida de enteros pequeños endian de archivo
- Soporte de speex en android
- Cómo agregar un encabezado a un objeto de solicitud OkHttp que se ha construido?
- ¿Cómo funciona maximumPoolSize de ThreadPoolExecutor?
- Cómo crear un número variable de vistas de texto en android
- ¿Cómo es posible tener ClassCastException después de que instanceof devuelve true
- Cómo mostrar y establecer el evento de clic en Flecha de retroceso en la barra de herramientas
- Cómo utilizar ClickableSpans en un TextView y seguir siendo capaz de desplazarse horizontalmente?
- AndroidManifest.xml para Gradle instrumentTest
Es posible iniciar actividades dentro de pestañas . Por lo tanto, establezca el contenido tabspec en un ActivityGroup en lugar de una Activity regular.
tabHost.addTab(tabHost.newTabSpec("Tab") .setIndicator("Tab") .setContent(new Intent(this, YourActivityGROUP.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)));
Desde dentro de ese grupo de actividades, puede iniciar otra actividad como ésta que sólo actualiza el contenido de la pestaña en la que se encuentra.
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<String> stack; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (stack == null) stack = new Stack<String>(); //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()); } } }
Lengüeta de lanzamiento
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 de nuevo
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
He resuelto con esto: Experiencia – Múltiples actividades de Android en un TabActivity
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 pulse en la pestaña
Commonsware.com es correcto, no es posible. Yo tenía un problema similar, pero era sólo una actividad que se estaba lanzando. He sacrificado un poco de mi arquitectura y eliminado la actividad que se inició desde dentro de la pestaña. Puse el código en una vista y luego agregé un ViewAnimator a la actividad de la pestaña. Anulé el botón de la parte posteriora y quito esa visión si está para arriba, o bien dejo el botón trasero funcionar como normal.
Esto lo simuló bastante bien, y por sólo una actividad estrechamente relacionada, no voy a perder ningún sueño sobre las consideraciones de diseño.
¿Qué tal 2 tabbar en este problema. Primero 1 es menú inferior tabbar, segundo es tabbar superior, son actividad diferente y xml
¿Como puedo abrir un fragmento o actividad de 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<String> 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; > } }
- Texto a voz (TTS) -Android
- Android spinner con selector de fechas, como la aplicación Google Calendar