2012-03-28 25 views
7

Tengo un diseño para el modo horizontal que muestra un ListView a la izquierda y un FrameLayout a la derecha. Cuando se selecciona un elemento de la lista otro fragmento se añade a la FrameLayout¿No se puede eliminar un fragmento de FrameLayout?

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
    myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commitAllowingStateLoss(); 
} 

Más tarde me presione SUPR en la vista de lista y eliminar el último elemento de la lista, e intento para eliminar el fragmento para que nada se muestra, pero no funciona, mi fragmento permanece en la pantalla. El código para eliminar es:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.remove(myFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
ft.commitAllowingStateLoss(); 

¿Alguna idea de por qué no se está eliminando de la vista?

+3

Estoy teniendo exactamente el mismo problema. ¿Se ha alcanzado alguna resolución? – Jared

Respuesta

3

¿está declarando el fragmento en xml? Citando Dianne Hackborn de Google:

Definición de fragmentos de XML está destinado sobre todo para las cosas que van a permanecer alrededor. Si está yendo a agregar y eliminar, probablemente debería hacerlo constantemente de forma dinámica.

creo que sirve

+0

Creo que se está refiriendo al uso de la etiqueta en el diseño XML. No estoy usando eso, estoy usando FrameLayout como marcador de posición y actualizando dinámicamente el fragmento que se coloca en él. Podría intentar usar el método FragmentTransaction.hide() que se mencionó en el hilo al que hizo referencia. – DaveJohnston

+0

Bueno, esta API es simplemente malo. Hace una simple llamada 'remove()', y lo más básico que esperaba que hiciera no funciona. – milosmns

+0

Funciona para fragmentos añadidos con una transacción explícita, hecha por usted, programáticamente. – Blackbelt

0

cuando la búsqueda de su fragmento por Id que tienes referencia al contenedor fragmento de no fragmentar en sí. utilizar una etiqueta cuando addiing fragmento y luego encontrar por TAG:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag"); 
11

@DaveJohnston He tratado de su código para el fragmento I remove modelada simplemente .... gracias :)

Hey, yo no sé esta es la solución a su problema o no, sino que tratan de esta manera va a trabajar:

enfoque para agregar fragmento:

YourFragment yourFrament; 

//Add your Fragment 
public void addYourFragment(){ 
yourFragment = new YourFragment(); 

FragmentTransaction transation = getSupportFragmentManager().beginTransaction(); 
transation.replace(R.id.yourFlowLayout, yourFragment); 

     transation.commit(); 

} 

enfoque para eliminar Fragmento:

//Remove Fragment 
    public void removeYourFragment(){ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      if (yourFragment != null) {   
       transaction.remove(yourFragment); 
       transaction.commit(); 
       transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
       yourFragment = null; 
      } 
    } 
+0

¿qué pasará si escribo transaction.remove (null)? ¿eliminará la parte superior del fragmento en la pila? o ¿qué pasará? –

0

que tenían un tiempo muy difícil encontrar un SO referencia a este problema se produce cuando no establecer <fragment> a través de XML, pero de hecho el establecimiento de cada Fragment dinámicamente con FragmentTransaction y <FrameLayout>.

Simplificando la solución de Gru, lo que me solucionó fue simplemente agregar .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) a mi transacción de reemplazo y ¡funcionó! Los fragmentos anteriores ahora están ocultos a la vista.

Imagino que otras transiciones también funcionarían.

0
private static String TAG_FRAGMENT="MyFragment"; 
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
     myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment,TAG_FRAGMENT); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(TAG_FRAGMENT); 
    ft.commit(); 
} 

cuando la sustitución de su fragmento de usar ft.addToBackStack(null) método después de quitar fácilmente su fragmento.

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 

if(fragment != null) 
getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 
0

Si usted tiene un Fragment que no se elimina en la sustitución de la Fragment en el FrameLayout? puede eliminarlo realizando una transición de eliminación por separado con FragmentTransaction.TRANSIT_FRAGMENT_CLOSE en él antes de una llamada a la confirmación de reemplazo regular.

Fragment removeThisFragment;//Keep a reference to the fragment you want to remove 
... 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

// This fragment "sometimes" do not get replaced so we remove it here if it's added. 
     if(removeThisFragment!=null&&removeThisFragment.isAdded()) { 
      transaction = fragmentManager.beginTransaction(); 
      transaction.remove(removeThisFragment); 
      transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
      transaction.commitAllowingStateLoss(); 
     } 

     // update the main content by replacing fragments 
     transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, TAG_MAIN_FRAGMENT).commit(); 

Pero sugiero a tratar de averiguar por qué el primer fragmento no se reemplaza, en primer lugar, comprobar si se está haciendo un trabajo pesado o algo evitando que crezca reemplazado ?? pero si necesita una solución temporal rápida intente con el código anterior.

Cuestiones relacionadas