8

Es una pregunta bastante nueva, pero de todos modos. Como Tabhost está depreciado, traté de cambiar a las pestañas de la barra de acciones, pero tengo mis problemas para usar fragmentos. ¿Existe la posibilidad de utilizar actividades dentro de las pestañas de la barra de acciones de todos modos?¿Barras de la barra de acciones sin usar fragmentos?

Agradeceria cualquier ayuda.

Gracias.

+0

Realmente necesita usar Fragmentos. ¿Cuáles son sus problemas al usar Fragmentos? – nhaarman

+0

Como ya he desarrollado mi aplicación utilizando Tabhost, tengo ciertos problemas para "convertir" mis pestañas en un fragmento. Mi principal problema, entre otros :) es básicamente que no hay un ejemplo simple sobre cómo usar la Lista expansible y los fragmentos. – Maddin

+1

Publica una pregunta sobre ExpandableList y fragmentos ... Apuesto a que obtendrías algo de ayuda. :) – Barak

Respuesta

3

Si ya estás en el uso de Actividades sobre fragmentos que sólo podría utilizar una intención de poner en marcha su actividad desde su ActionBar.TabListener

startActivity(new Intent(thisActivity(), thatActivity.class)); 

También debe comprobar fuera de este comentario sobre el uso de Fragments over Activities

+4

Comenzar una actividad presionando una pestaña de la barra de acciones sería ridículo, ya que al hacerlo se eliminaría la pestaña y la barra de acciones en sí, reemplazándola con el contenido de la otra actividad. – CommonsWare

+0

Eso es donde entraron las subclases, la idea no es ridícula en absoluto. – slinden77

+0

En realidad, así es exactamente como Google I/O 2014 está [implementado] (https: // github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/BaseActivity.java # L802). Cuando se hace clic en un elemento en el cajón de navegación, se inicia una nueva actividad, esto recrea el cajón de navegación. Una clase llamada 'BaseActivity' se usa para implementar el cajón de navegación para todas las clases. – Benjamin

2

¿Existe la posibilidad de utilizar actividades dentro de las pestañas de la barra de acciones de todos modos?

Afortunadamente, no.

Eso no significa que tengas que usar fragmentos, sin embargo. Su TabListener puede hacer lo que quiera para afectar el cambio en su UI. Una solución de fuerza bruta sería volver a llamar al setContentView(), descargar todos los widgets antiguos y establecer un conjunto nuevo (presumiblemente diferente).

+0

Gracias por su respuesta. Intenté con la solución que sugirió Mr Engineer, pero sucedió lo que dijiste que sería. Por supuesto, con solo cambiar la Vista, se muestran mis dos ventanas, pero se ha perdido un gran control. Supongo que para proporcionar la apariencia de la ahora depreciada TabHost tendré que usar fragmentos. – Maddin

+0

esta respuesta es incorrecta, ya que es muy posible de hecho – slinden77

+0

He intentado esta solución y es posible, pero definitivamente es un truco. La pregunta es, dado que esta no es la forma óptima de crear una pestaña, ¿qué tan gravemente afecta el rendimiento de mi aplicación? Quiero decir que es una solución tan mala que vale la pena aprender a usar los fragmentos correctamente y reescribir mi aplicación usándolos. – Kalaji

0

Es posible usar un Activity con el ActionBar. Sin embargo, ten en cuenta que esto no es un comportamiento intencionado, pero eso no significa que no funcione a la perfección.

import android.annotation.SuppressLint; 
import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 

//@SuppressLint("NewApi") 
public class ActionBarActivity extends Activity { 

    private String TAG = getClass().getName(); 
    private Intent i = null; 
    private ActionBar actionBar; 
    private Tab one; 
    private Tab two; 
    private Tab three; 

    // create a tab listener that is called when the user changes tabs 
    ActionBar.TabListener tabListener = new ActionBar.TabListener() { 
     @Override 
     public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) { 
      if (tab.getTag().equals("one")){ 
       Log.d(TAG, "tab one selected"); 
       i = new Intent(getApplicationContext(), One.class); 
       determineRun(); 
      } 
      if (tab.getTag().equals("two")){ 
       Log.d(TAG, "tab two selected"); 
       i = new Intent(getApplicationContext(), Two.class); 
       determineRun(); 
      } 
      if (tab.getTag().equals("three")){ 
       Log.d(TAG, "tab three selected"); 
       i = new Intent(getApplicationContext(), Three.class); 
       determineRun(); 
      }   
     } 

     @Override 
     public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) { 
      // TODO Auto-generated method stub   
     } 

     @Override 
     public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) { 
      // TODO Auto-generated method stub  
     } 
    }; 

    // we only need to start the Activity if it's not actually already the current Activity! 
    void determineRun(){ 
     if (!TAG.equals(i.getComponent().getClassName())){ 
      startActivity(i); 
     } 
     return; 
    }//end method 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 

     actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(true); 
     actionBar.setSubtitle(getResources().getString("subtitle"));   
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
     one = actionBar.newTab(); 
     one.setText("Tab 1").setTag("one"); 
     two = actionBar.newTab(); 
     two.setText("Tab 2").setTag("two"); 
     three = actionBar.newTab(); 
     three.setText("Tab 3").setTag("three");     
     one.setTabListener(tabListener); 
     two.setTabListener(tabListener); 
     three.setTabListener(tabListener); 

     // You will have to set the selected Tab manually 
     // A good idea would be to create a subclass for each Tab based on this code 
     // Then, just create a new Activity which extends ActionBarActivity 
     actionBar.addTab(one, 0, false); 
     actionBar.addTab(two, 1, true); // selected Tab 
     actionBar.addTab(three, 2, false); 
    }//end method 

    @Override 
    public void onResume(){ 
     super.onResume(); 

     Log.d(TAG, "onResume()"); 
     Log.d(TAG, ""+i.getComponent().getClassName()); 
     // again, here you need to select the Tab manually 
     if (!TAG.equals(i.getComponent().getClassName())){ 
      actionBar.selectTab(two); // selected Tab 
     } 
    }//end method 

    @Override 
    public void onPause(){ 
     super.onPause(); 

     Log.d(TAG, "onPause()"); 
    }//end method 

    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 

     overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 
    }//end method  
}//end class 

es probable que desee para anular la animación en su Activity por lo que el cambio de pestañas es sin costuras. Para ello, modifique el método de su ActivityonCreate() que se extiende ActionBarActivity

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    overridePendingTransition(0, 0); 
}//end method 
+0

Estas no son actividades en las pestañas de la barra de acciones. Estas son actividades * iniciadas por pestañas de la barra de acciones * que luego toman el control de la pantalla. Esto no se relaciona en absoluto con la pregunta del OP. – CommonsWare

+0

tiene el mismo efecto, no pequemos una palabra – slinden77

0

si mi interpretación es correcta, desea utilizar la barra de acción para cambiar la actividad en lugar de los fragmentos. en este caso, continúe leyendo.

del documento oficial que puede ver, la característica de la barra de acciones define un conjunto de ui, posición. si desea implementar la barra de acciones con actividad, lo más importante que debe hacer es 1. asociar su pestaña (posición) con su actividad. 2. agregar devolución de llamada de tablistener (crear una instancia de su actividad nueva, detener la actividad actual) cada vez que se hace clic en la pestaña

el mejor diseño es tener el tablistener implementado una clase separada, para que cada actividad pueda usar esta clase .

Cuestiones relacionadas