2012-03-28 22 views
7

Mam układ dla trybu poziomego, który pokazuje ListView po lewej stronie i FrameLayout po prawej. Gdy element jest wybrany z listy inny fragment zostanie dodany do FrameLayoutNie można usunąć fragmentu z 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(); 
} 

Później klawisz Delete w widoku listy i usunąć ostatni element na liście, a ja staram się usunąć fragment tak że nic jest wyświetlany, ale nie działa, mój fragment pozostaje na ekranie. Kod do usunięcia to:

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

Jakieś pomysły, dlaczego nie zostały usunięte z widoku?

+3

Mam dokładnie ten sam problem. Czy osiągnięto jakąkolwiek rozdzielczość? – Jared

Odpowiedz

3

Czy deklarujesz fragment w formacie xml? Powołując Dianne Hackborn z google:

Definiowanie fragmentów w XML przeznaczony jest głównie dla rzeczy, które idą do zatrzymania się. Jeśli zamierzasz dodawać i usuwać pliki, powinieneś konsekwentnie robić to dynamicznie.

nadzieję, że pomoże

+0

Myślę, że on odnosi się do używania znacznika w układzie XML. Nie używam tego, używam FrameLayout jako elementu zastępczego i dynamicznie aktualizuję wstawiony fragment. Mogę spróbować użyć metody FragmentTransaction.hide(), która została wspomniana w wątku, do którego się odwołałeś. – DaveJohnston

+0

Cóż, ten interfejs API jest po prostu zły. Wykonujesz proste wywołanie "remove()", a bardzo podstawowa rzecz, której oczekiwałeś, nie działa. – milosmns

+0

Działa dla fragmentów dodanych za pomocą jawnej transakcji, wykonanej przez ciebie programowo. – Blackbelt

0

podczas znajdowania Twój fragment o Id masz odniesienie do fragmentu pojemnika nie fragment siebie. użyć znacznika podczas addiing fragment, a następnie znalezienie przez tag:

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

@DaveJohnston Próbowałem swój kod remove fragmentu Właśnie formowane .... dzięki :)

Hej to ja nie wiem jest rozwiązanie problemu lub nie, ale spróbuj w ten sposób to będzie działać:

Podejście dodać fragment:

YourFragment yourFrament; 

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

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

     transation.commit(); 

} 

Podejście do usunięcia fragment:

//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

co się stanie, jeśli napiszę transaction.remove (null)? czy usunie najwyższy fragment w stosie? albo co się stanie? –

0

miałem bardzo trudno jest znaleźć SO odwoływać się do tego problemu występującego gdy nie ustawienie <fragment> poprzez XML, ale rzeczywiście ustawienie każdego Fragment dynamicznie FragmentTransaction i <FrameLayout>.

Upraszczając rozwiązanie Gru, rozwiązanie go dla mnie polegało po prostu na dodaniu .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) do mojej transakcji wymiany i zadziałało! Poprzednie fragmenty są obecnie ukryte.

Wyobrażam sobie, że inne przejścia też by działały.

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(); 
} 

przy wymianie fragmentu na metodę ft.addToBackStack(null) po łatwym usunięciu fragmentu.

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

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

Jeśli masz Fragment że nie jest usuwany na wymianie Fragment w FrameLayout? możesz go usunąć przez zatwierdzenie osobnego przejścia do usuwania z FragmentTransaction.TRANSIT_FRAGMENT_CLOSE na nim przed wywołaniem regularnego zamiany zatwierdzenia.

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(); 

Ale sugeruję, aby spróbować dowiedzieć się, dlaczego pierwszy fragment nie otrzymuje w pierwszej kolejności należy sprawdzić, czy to robi jakąś ciężką pracę czy coś utrzymując ją z coraz zastąpiony ?? ale jeśli potrzebujesz szybkiej tymczasowej poprawki, wypróbuj powyższy kod.

Powiązane problemy