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:
- Crea solo una
FragmentActivity
. - Coloque
TabWidget
en el diseño deFragmentActivity
. Haga queTabWidget
una altura de contenido = 0. - En
TabWidget
en XML, declara contenedor para tuFragment
s (FrameLayout
por ejemplo). - En
FragmentActivity
simplemente maneja qué pestaña está seleccionada (TabHost.OnTabChangeListener
) y coloca elFragment
necesario en el contenedor. - 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.