2015-06-09 23 views
5

Pracuję nad aplikacją, która używa fragmentów, w zeszłym tygodniu moje urządzenie testowe miało aktualizację Lolipop. Kiedy testuję swoją aplikację na urządzeniu Lolipop, zobaczyłem, że metoda wymiany Fragment Transaction nie działa poprawnie.Wymiana Fragmentów na API-21 pozostaje za

Działa z myląco w wersji Lolipop, mimo że wszystko w porządku w wersji Kitkat.

W celu wyjaśnienia mojej sytuacji dodałem kilka zdjęć.

- Pierwszy ekran ---------------------------- KitKat ------------- ------------------------ Lollipop -------------

enter image description here enter image description here enter image description here

Jak widać, gdy używam kitkat, wszystko dobrze, ale zaraz po użyciu lolipop fragment wymiany transakcji działa myląco.

Oto mój kod przycisku;

mButtonOk.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       FeedbackFragment mFragmentFeedBack = new FeedbackFragment(); 
       android.app.FragmentManager fm = getFragmentManager(); 
       fm.executePendingTransactions(); 
       android.app.FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
       if (mFragmentFeedBack.isVisible()) { 
        fragmentTransaction.hide(mFragmentFeedBack); 
       } else { 

        if (!mFragmentFeedBack.isAdded()) { 
         fragmentTransaction.replace(R.id.containerfragment, mFragmentFeedBack); 
        } 


        fragmentTransaction.show(mFragmentFeedBack); 
       } 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.commit(); 

      } 
     }); 

tutaj jest mój xml;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" tools:context=".MainActivity"> 


<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:id="@+id/button" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="117dp" /> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/containerfragment"> 

</FrameLayout> 

EDIT: wersja Kitkat działa na tablecie, ale próbowałem moją aplikację na telefon (w wersji KitKat) wynik jest taki sam. Bez zmian.

Dzięki.

+0

Czy sprawdzić w tablecie (z Lollipop) tej samej aplikacji? –

+0

Tak. działa tak samo. Podczas testowania urządzenia w wersji Lollipop, zastępowany fragment pozostaje w tyle. – salih

+0

Powiedziałeś "Widziałem, że metoda wymiany Fragment Transaction nie działa poprawnie". Ale wydaje mi się, że fragmentTransaction.hide jest wykonywany zamiast replace(), ze względu na kod, jeśli (mFragmentFeedBack.isVisible()). Czy myślisz, że to możliwe? W takim przypadku sprawdź przynajmniej KitKat. –

Odpowiedz

0

Ewentualny problem może być kod:

if (mFragmentFeedBack.isVisible()) 

Nie polecam tej metody do sprawdzania widoczności. Zgodnie z dokumentacją @Fragment isVisible(), to mówi

... Oznacza to, że: (1) został dodany, (2) ma swój pogląd przymocowany do okna , oraz (3) nie jest ukryte.

Ta część zdania nie jest zbyt jasna. Podejrzewam, że KitKat mówi, że to NIE jest widoczne, ale Lollipop mówi, że tak, i zgadzam się z implementacją Lollipopa. KitKat mówi, że Fragment jest dodany (tak), widok jest załączony (tak), ukryty (naprawdę nie!). To jest rzeczywiście problem z GUI z innymi bibliotekami GUI, wierz lub nie!

Możliwe rozwiązania, na teraz:

  1. Tworzenie logiczną flagi i utrzymać flagę między 2 fragmentów. Jeśli jest to proste, jest to najlepsze.
  2. Sprawdź, czy przycisk lub widok jest klikalny, nie wiem, który. To jest bardziej solidne niż sprawdzanie isVisible().
  3. Myślę, że projekt kodu jest nieco bardziej skomplikowany niż powinien. Na razie to moja sugestia. Kiedy użytkownik kliknie "Nowy przycisk", po prostu wywołaj metodę replace(), nie używaj metod hide/show. Gdy użytkownik kliknie przycisk WYŚLIJ w fragmencie sprzężenia zwrotnego, wywołaj metody popBackStack() lub replace().Co ty na to?
+0

Twoje rozwiązanie wydaje mi się dobre, ale nie mogę sprawdzić, czy przycisk jest klikalny, czy klikalny. Ponieważ kliknięcie przycisku evertime przycisku jest klikalne. Nie jestem w stanie wdrożyć tego rozwiązania w moim projekcie. :( – salih

+0

Co powiesz na możliwe rozwiązanie # 1? –

+0

Dodałem inne możliwe rozwiązanie na # 3. Jeśli się zgodzisz, możesz znaleźć przykładowy kod dla niego? –