tabhost studio how example android android-fragments android-tabhost android-fragmentactivity

how - tabhost android studio



Reemplazo de TabActivity con FragmentActivity y Fragments (2)

Como 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.

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 responder y buscar en Internet, 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. Aquí está mi repositorio GitHub, creé una pequeña aplicación de muestra para este problema.


Como TabActivity está en desuso, necesito encontrar una forma de hacerlo con Fragments.

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

Le recuerdo que puede usar TabWidget sin TabActivity . Entonces puedes probar esta solución:

  1. Crea solo una FragmentActivity .
  2. Coloque TabWidget en el diseño de FragmentActivity . Haga que TabWidget una altura de contenido = 0.
  3. En TabWidget en XML, declara contenedor para tu Fragment s ( FrameLayout por ejemplo).
  4. En FragmentActivity simplemente maneja qué pestaña está seleccionada ( TabHost.OnTabChangeListener ) y coloca el Fragment necesario en el contenedor.
  5. Ponga las lógicas programm (que fue anteriormente en diferentes actividades) en diferentes Fragmentos.

O bien, puede crear FragmentActivity con TabWidget , y en lugar de cambiar Fragment s, puede colocar Fragment s en el contenido de cada pestaña.

Por ejemplo, si tienes 3 pestañas y 3 fragmentos, prueba lo que hago. Llame a 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 haces, tus variables fragmentX no se eliminarán cada vez que las pongas en fragment_container . Vivirán mientras tu FragmentActivity viva. Mire el ciclo de vida de los fragmentos . Solo los métodos de fragmentos OnCreateView y onDestroyView invocarán una y otra vez mientras replace un fragmento por otro.

También Fragments tiene su método onSaveInstanceState donde puedes guardar el estado de tu fragmento. Por ejemplo: el usuario escribió su nombre en editText de fragment1. Si desea mantener esta información (cadena de nombre) mientras el usuario descubre otros fragmentos, debe

1.save la cadena de nombre en el método onSaveInstanceState de fragment1
2. en el método onCreateView de fragment1 comprueba el paquete savedInstanceState, si no es nulo, completa el texto de edición con la cadena 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.

Además, si llama a setRetainInstance(true) en el método onCreateView() de su fragment , el sistema intentará guardar el estado del fragmento (con todos los datos de entrada). enlace a la descripción


El enfoque de poner contenidos de pestañas en actividades separadas está en desuso, ya que ahora tenemos el marco de Fragmentos. 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 usar la barra de navegación con pestaña de navegación en lugar de usar el widget TabHost.