2013-08-19 16 views
15

Mam aktywność związaną z DrawerLayout, korzystając z wytycznych od http://developer.android.com/training/implementing-navigation/nav-drawer.html.Fragmenty wyświetlane nad sobą

Kiedy klikam na drawerItem, zastąpić bieżący widok z nowego fragmentu:

Fragment fragment; 
Bundle args = new Bundle();  
fragment = new NewsListFragment(); 
args.putInt("category", position); 

// Insert the fragment by replacing any existing fragment 
FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction() 
        .replace(R.id.content_frame, fragment) 
        .commit();   
mDrawerList.setItemChecked(position, true); 

Teraz czasami stary fragment nie otrzymuje jednak nowy fragment jest umieszczony na szczycie starego:

http://img15.imageshack.us/img15/3179/1kqj.png

Dlaczego to ma być, i jak rozwiązać ten problem?

Stosowna XML:

<!-- The main content view --> 
<LinearLayout 
    android:id="@+id/rlMain" 
    android:layout_width="fill_parent" 
    android:orientation="vertical" 
    android:layout_height="fill_parent"> 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1"> 
    </FrameLayout> 

Dzieje się tak tylko czasami, i nie znalazłem przepływ do odtworzenia tego jeszcze. Aplikacja nie obsługuje rotacji, więc nie może się tam pojawić.

+0

Fragment fragmentu; Bundle args = new Bundle(); fragment = new NewsListFragment(); args.putInt ("category", position); // Wstaw fragment, zastępując istniejący fragment FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace (R.id.content_frame fragment) \t \t \t \t .addToBackStack (zerowy) .commit(); mDrawerList.setItemChecked (pozycja, prawda); –

+0

czy możesz wkleić swój xml? –

+6

spróbuj użyć 'container.removeAllViews();' w metodzie 'onCreateView' proszę –

Odpowiedz

19

Poszliśmy żyć z tą wersją i przystań otrzymała żadnych skarg na ten temat, więc zakładam, że to była prawidłowa odpowiedź:

w swojej metodzie onCreateView dodać:

if (container != null) { 
    container.removeAllViews(); 
} 

Pamiętaj, aby sprawdzić, czy kontener nie jest pusty!

Dzięki https://stackoverflow.com/users/2677588/lia-pronina!

+1

Należy sprawdzić zachowanie przycisku Wstecz, ponieważ może on odwoływać się do starego fragmentu w backStack. Jeśli tak, użyj 'getActivity(). GetFragmentManager(). PopBackStack()' –

0

spróbujmy z

fragmentManager.beginTransaction().executePendingTransactions(); 

po wywołaniu commit() metoda

0

Dodaj w każdym układzie

android:background="#FFFFFF" 

Tło układy zalega są transparen, więc wystarczy umieścić kolor tła i nowych elementów fragment, nie wyświetla się stary fragment

9

Po około 1 tygodnia, Znalazłem rozwiązanie bez dodawania koloru tła lub czegokolwiek innego. Po prostu dodaj ten kod i napraw to bzdury. Mam nadzieję, że to pomoże wam wszystkim.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    container.clearDisappearingChildren(); 
    return inflater.inflate(R.layout.fragment, container, false); 
} 
0

uruchomić w tym samym problemem i widzę, że nie ma już zaakceptowane odpowiedź, ale te odpowiedzi nie jest w 100% rację, a nie rozwiązać mój problem. Proponowana odpowiedź @Niels usuwa widoki, ale fragment (y) jest (są) nadal dodawany. to czego używam:

/** 
* Call this to remove all the other added fragments and keep only the current one. 
* 
* @param activity the activity to which the fragment has been attached. 
* @param fragment the fragment we want to keep. 
*/ 
public static void removeOtherAddedFragments(@NonNull AppCompatActivity activity, @NonNull Fragment fragment) { 
    FragmentManager fragmentManager = activity.getSupportFragmentManager(); 
    for (Fragment frag : fragmentManager.getFragments()) { 
     if (frag != null && !frag.equals(fragment) && frag.isAdded()) { 
      fragmentManager.beginTransaction().remove(frag).commit(); 
     } 
    } 
} 

Wołam w moim onResume aby mieć pewność, że będzie on również nazywany kiedy nawigować z powrotem do fragmentu.

+0

nie możesz po prostu wywołać metody fragmentTransaction.replace() zamiast add(), gdy pokazuje się nowy fragment na drugim? –

+0

Mam, ale problem jest w nawigacji tylnej. Jeśli masz: 1/dodaj A 2/zamień B (i nie trzymaj na skrzyni) 3/zamień C (i zachowaj na tylnym biegu) 4/wróć, możesz mieć problem. to błąd z Androida: zamień "usuń/ukryj i dodaj", a nie "usuń i dodaj", a gdy nowy zostanie dodany, drugi pozostanie w tyle ... –