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:
- Crear solo uno
FragmentActivity
.
- Ponga
TabWidget
en el diseño de FragmentActivity
. Hacer TabWidget
's contenido altura = 0.
- En
TabWidget
en XML declarar contenedor para usted Fragment
s (FrameLayout
por ejemplo).
- En
FragmentActivity
simplemente controle qué pestaña está seleccionada (TabHost.OnTabChangeListener
) y ponga el Fragment
en el contenedor.
- 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
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
he editado mi respuesta. Mira eso. Y también hay ejemplos de fragmentos en las muestras ("ApiDemos"). Échales un vistazo. –
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