2012-04-12 24 views
19

Tengo tres fragmentos como se muestra en la figura a continuación. He agregado todos estos tres fragmentos en LinearLayout usando el archivo .xml y cuando se inicia mi actividad de inicio, cargo ese diseño .xml usando setContentView.

Tengo algunos controles en fragment2. Al hacer clic en cualquiera, se carga el fragmento programment programment utilizando FragmentTransaction y el método commit. Estos fragmentos se agregan a la pantalla, pero el problema es que el fragmento agregado en forma de gráfico4 ocupa toda el área de la pantalla. ¿Cual puede ser el problema?

Nota: En cualquier elemento, haga clic en f2 Quiero reemplazar solo f2 con el nuevo fragmento f4. Tenga en cuenta que he agregado f1, f2, f3 a través del archivo de diseño xml y agregado el nuevo fragmento f4 mediante programación.

enter image description hereReemplazar un fragmento programáticamente

+0

No está claro. ¿Estás mostrando los cuatro fragmentos al final? –

Respuesta

33

Siempre debe agregar, eliminar y reemplazar sus fragmentos de forma programática. Como tal, le sugiero que reemplace sus fragmentos F-1, F-2 y F-3 con contenedores como FrameLayout.

Básicamente, en lugar de tener un elemento <fragment/> como F-1, lo convierte en un elemento <FrameLayout/>. A continuación se realiza una transacción fragmento en onCreate de su FragmentActivity:

Fragment1 f1 = new Fragment1(); 
FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.f1_container, f1); // f1_container is your FrameLayout container 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
ft.addToBackStack(null); 
ft.commit(); 

Ahora, supongamos que ha hecho esto para F-1, F-2 y F-3. A continuación, reemplace f2 con f4 haciendo lo mismo nuevamente en su OnClickListener:

public void onClick(View v) { 
    Fragment4 f4 = new Fragment4(); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(R.id.f2_container, f4); // f2_container is your FrameLayout container 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 
+0

¿Tiene alguna referencia para que pueda tomar un ejemplo de allí? – MobiDev

+1

Edité mi respuesta. Esto debería resolver su problema. – CodePrimate

+1

Gracias. OK, lo que entiendo es que no pongan fragmentos directamente en el diseño xml. Ponga framelayouts en lugar de elementos de fragmento. Y mientras sustituyes f4 por f2 usa el cuadro de f2. ¿Estoy en lo cierto? Puede dar sitio de referencia para verificarlo. – MobiDev

2

Mantenga solo FrameLayout como marcadores de posición para el fragmento en el XML. En OnCreate carga los fragmentos en el framelayout. Al hacer clic en el fragmento, dale el ID de ese FrameLayout en particular para reemplazarlo por Fragment4.

Cuestiones relacionadas