5

Dado que TabActivity está en desuso, necesito encontrar una forma de hacerlo con Fragments. He trabajado con Fragments antes de saber cómo funciona, pero necesito una guía para crear mi host de pestañas con FragmentActivities. He encontrado un par de ejemplos en Internet, y se trata de poner fragmentos en un contenedor para las pestañas.Reemplazo de TabActivity con FragmentActivity y fragmentos

Lo que quiero es poner FragmentActivities para cada pestaña. Porque en mi aplicación usaré 4 pestañas y cada una de las pestañas tiene contenido realmente complejo. Como resultado, necesito tener FragmentActivity para cada pestaña para administrar los Fragmentos que colocaré debajo de cada pestaña dentro de un contenedor separado.

SOLUCIÓN:

Después de respuestas y buscar en Internet que terminó con una solución. De acuerdo con la solución que he encontrado, hago un seguimiento de los Fragmentos en una pila separada para cada pestaña en el separador de pestañas. Here es mi repositorio GitHub, creé una pequeña aplicación de muestra para este problema.

Respuesta

9

Dado que TabActivity está en desuso, necesito encontrar la manera de hacerlo con Fragments.

Si no desea utilizar TabActivity - olvídese de poner FragmentActivities en el contenido de las pestañas.

Recuerdo que puede usar TabWidget sin TabActivity. Para que pueda probar esta solución:

  1. Crear solo uno FragmentActivity.
  2. Ponga TabWidget en el diseño de FragmentActivity. Hacer TabWidget 's contenido altura = 0.
  3. En TabWidget en XML declarar contenedor para usted Fragment s (FrameLayout por ejemplo).
  4. En FragmentActivity simplemente controle qué pestaña está seleccionada (TabHost.OnTabChangeListener) y ponga el Fragment en el contenedor.
  5. Ponga la lógica de los programas (que fue anteriormente en diferentes actividades) en diferentes Fragmentos.

O puede crear FragmentActivity con TabWidget, y en lugar de cambiar Fragment s se puede poner directamente Fragment s en el contenido de cada ficha.

Por ejemplo, si tiene 3 pestañas y 3 fragmentos, intente lo que hago. Llame al showFragmentX cuando necesite cambiar un fragmento a otro.

public class Test extends FragmentActivity { 

private Fragment1 fragment1=new Fragment1(); 
private Fragment2 fragment2=new Fragment2(); 
private Fragment3 fragment3=new Fragment3(); 

private void showFragment1(){ 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragments_container, fragment1); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

private void showFragment2(){ 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragments_container, fragment2); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

private void showFragment3(){ 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    ft.replace(R.id.fragments_container, fragment3); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commit(); 
} 

@Override 
protected void onCreate(Bundle arg0) { 
    // TODO Auto-generated method stub 
    super.onCreate(arg0); 
    setContentView(R.layout.fragmentactivity_layout); 
} 
} 

Si lo hace sus fragmentX las variables no se borrará cada vez que se los pone en fragment_container.Vivirán mientras su FragmentActivity en vivo. Mira el fragments lifecycle. Solo OnCreateView y onDestroyView métodos de fragmentos llamarán una y otra vez mientras replace un fragmento a otro.

También Fragments tiene su método onSaveInstanceState donde puede guardar el estado de su fragmento. Por ejemplo: el usuario escribió su nombre en editText de fragment1. Si desea conservar estos datos (cadena de nombre) mientras que el usuario descubrir otros fragmentos que debe

1.save nombre de la cadena en el método de fragment1 onSaveInstanceState
2. en onCreateView método de haz de verificación savedInstanceState de fragment1, si no es nulo - llenar EditarTexto con la cuerda que obtienes del paquete.

public class Fragment1 extends Fragment { 

EditText nameEditText; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreateView(inflater, container, savedInstanceState); 

    View fragment1View=inflater.inflate(R.layout.fragment1_layout, container, false); 
    nameEditText=(EditText) fragment1View.findViewById(R.id.edittext_name); 

    //check for saved data. if it is not null - fill your edittext with saved string 
    if(savedInstanceState!=null){ 
     String nameString=(String) savedInstanceState.get("nameString"); 
     nameEditText.setText(nameString); 
    } 
    return fragment1View; 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    //save data that user have entered 
    outState.putString("nameString", nameEditText.getText().toString()); 
} 

}

Puede verificar los datos antes de guardar. Espero que mi punto sea claro ahora.

También si llama al setRetainInstance(true) en onCreateView() método de su fragment - el sistema intentará guardar el estado del fragmento (con todos los datos de entrada). link to description

+0

Thx para la respuesta, pero ahi viene otro problema si pongo fragmentos en lugar de actividades en pestañas. Por ejemplo, en la primera pestaña, quiero reemplazar el contenedor con otro fragmento en el caso en que el usuario haga clic en un botón, y luego, si cambio la pestaña, vaya a la segunda, esto reemplazará los fragmentos anteriores. Entonces, en el caso de que vaya a la primera pestaña de nuevo, crearé el fragmento nuevamente y no podré ver la página anterior. ¿Tienes alguna idea de cómo deshacerte de ella? – osayilgan

+0

he editado mi respuesta. Mira eso. Y también hay ejemplos de fragmentos en las muestras ("ApiDemos"). Échales un vistazo. –

+0

Sí, lo tengo, pero esto no es lo que estoy preguntando. He trabajado con fragmentos y sé cómo funciona. Lo que no sé es que: supongamos que estamos en la primera pestaña y llamé a otro fragmento en el caso en que el usuario haga clic en el botón, para el segundo paso cambié la pestaña a la segunda, así que aquí esto reemplazará los datos en ella con el fragmento de las segundas pestañas ¿verdad? Pero también quiero que la cosa se haya cambiado en la primera pestaña. De esta manera, si solo reemplazo los fragmentos enTabChange, esto no mantendrá el contenido previamente cambiado en la pestaña anterior. Alguna idea ? – osayilgan

1

El enfoque de poner contenido de pestañas en actividades separadas está en desuso, ya que ahora tenemos el marco Fragment. Debe poner el contenido complejo de las pestañas en Fragmentos, y cambiar esos Fragmentos cuando el usuario seleccione pestañas.

La solución recomendada para esto es utilizar la barra de desplazamiento con navegación Tab en lugar de utilizar el widget TabHost.

+0

Gracias por la respuesta, tengo algunas preocupaciones sobre su uso. Por ejemplo, si pongo un fragmento para la primera pestaña, necesitaré una navegación dentro de la misma pestaña y, por lo que sé, estamos utilizando solo un contenedor para las pestañas completas y los fragmentos que contiene, así que después de agregar un par de fragmentos a contenedor principal dentro de la primera pestaña, lo cambiaré a la segunda pestaña, así que cuando lo haga, eliminará todos los fragmentos que he creado y los colocaré en el contenedor dentro de la primera pestaña y colocará el segundo fragmento en la pestaña principal. contenedor, – osayilgan

+0

lo que significa que todos los datos que creé en la primera pestaña se eliminarán y se reemplazarán con un segundo fragmento? ¿Qué pasa si vuelvo a la primera pestaña? ¿Lo estaré recreando? – osayilgan

Cuestiones relacionadas