2013-05-15 9 views
29

My Android aplikacji uruchamia się BeginActivity który jest podklasą SherlockFragmentActivity i pokazuje to pierwszy widok, używając:Fragment jest przezroczysta i wykazuje aktywność poniżej

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { 
      Fragment f = LoginFragment.newInstance(); 

      getSupportFragmentManager() 
        .beginTransaction() 
        .add(android.R.id.content, f, "loginfragment") 
        .attach(f) 
        .commit(); 
     } 
} 

LoginFragment pokazuje widok takiego:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.login, container, false); 

     // Get pointers to text views 
     usernameField = (EditText) v.findViewById(R.id.usernameLog); 
     passwordField = (EditText) v.findViewById(R.id.passwordLog); 
     progressBar = (ProgressBar) v.findViewById(R.id.progressBarLog); 
     // Set button click listeners for both buttons 
     Button b = (Button) v.findViewById(R.id.loginButton); 
     b.setOnClickListener(this); 

     return v; 
    } 

po kliknięciu logowania wyświetlam widok listy w następujący sposób:

BeginActivity top = (BeginActivity) getActivity(); 
Fragment f = OfferListFragment.newInstance(); 
     top.getSupportFragmentManager() 
       .beginTransaction() 
       .add(android.R.id.content, f, "offerList") 
       .addToBackStack(f.getClass().getSimpleName()) 
       .commit(); 

oraz wreszcie OfferListFragment wyświetla jego widok tak:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.offers, container, false); 

     return v; 
    } 

Teraz problem mam, jest to, że ostateczna OfferListFragment wydaje się być przejrzyste i widzę ekran logowania poniżej niego. Używam Theme.Sherlock, który ma czarne tło. Czy powinienem ręcznie ustawiać widoki tła na czarny? A może czarny w temacie może być dostosowywany przez użytkownika w systemie? (Nie jestem użytkownikiem Androida).

Dzięki

+0

Czy chcesz całkowicie usunąć 'LoginFragment' z' BeginActivity' podczas wyświetlania 'OfferListFragment'? –

+0

Nieszczególnie. Użytkownik powinien mieć możliwość kliknięcia przycisku Wstecz, aby wrócić do niego. – Darren

+0

OK bro.Nie jestem pewien, ale czy próbowałeś używając 'replace (int, android.app.Fragment)' z klasy 'FragmentTransaction'? –

Odpowiedz

30

Spróbuj użyć FragmentTransaction klasę replace fragmenty zamiast po prostu dodając.

Objaśnienie:

Każda transakcja jest zestaw zmian, które chcesz wykonać w tym samym czasie. Możesz ustawić wszystkie zmiany, które chcesz wykonać dla danej transakcji, za pomocą metod takich jak add(), remove() i . Następnie, aby zastosować transakcję do działania, musisz zadzwonić pod numer commit().

Zanim jednak zadzwonisz pod numer commit(), możesz zadzwonić pod numer addToBackStack(), aby dodać transakcję do tylnego stosu transakcji fragmentów. Ten stos powrotny jest zarządzany przez działanie i pozwala użytkownikowi powrócić do poprzedniego stanu fragmentu, naciskając przycisk Wstecz.

Na przykład, oto jak można zastąpić jeden fragment z drugiego, i zachować poprzedni stan na tylnym stosu:

Przykład:

// Create new fragment and transaction 
Fragment newFragment = new ExampleFragment(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

// Replace whatever is in the fragment_container view with this fragment, 
// and add the transaction to the back stack 
transaction.replace(R.id.fragment_container, newFragment); 
transaction.addToBackStack(null); 

// Commit the transaction 
transaction.commit(); 

referencyjny: Proszę mieć spójrz na Managing Fragments

Mam nadzieję, że będzie pomocna !!

+0

Twoje niesamowite. To rozwiązało dla mnie wiele problemów, w tym ten http://stackoverflow.com/questions/16594352/listener-for-when-a-fragment-becomes-visible Dziękuję – Darren

+1

Nie zawsze jest to najlepsze rozwiązanie po prostu zastąpienie fragmentu , większość ludzi będzie musiała dodać, żeby mieć implementację backstacku, możemy to przedyskutować :) zobacz moją odpowiedź – Goofyahead

+0

@Goofyahead: Jeśli spojrzysz na kod podany w pytaniu przez Darrena, już używał mechanizmu do 'add' Fragmenty zamiast 'replace'.Ale problem, był w stanie zobaczyć' fragment logowania', który był bezcelowy po zalogowaniu się raz.so zasugerowałem, aby pozbyć się go za pomocą 'replace' z fragmentem' OfferListFragment'. –

61

IMHO Nie zgadzam się z tą odpowiedzią.

Może chcesz zastąpić fragment lub możesz go dodać.

Na przykład załóżmy, że znajdujesz się w fragmencie, który jest listą pobraną przez żądanie sieciowe, jeśli zamienisz fragment na, powiedzmy, detailFragment i dodasz go do backStack.

Kiedy wrócisz do swojego fragmentu, przerwiesz zapytanie sieciowe, oczywiście możesz go buforować, ale dlaczego?Jest to powrót do poprzedniego stanu, więc przy dodawaniu ostatni fragment będzie miał dokładnie taki sam status bez żadnego kodu.

Fragmenty są domyślnie przezroczyste w tle, ponieważ można je malować tylko na niewielkiej części ekranu, ale jeśli fragment jest dopasowywany, ustaw jego tło na kolor i używaj polecenia dodaj fragmentTransakcję.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/scrollView1" 
android:background="@android:color/white" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" > 

To będzie twój element główny w układzie XML fragmentu może być liniowy, etc etc i kod transakcji jest:

YourFragment detail = YourFragment.newInstance(Id); 
ft.add(R.id.contentHolder, detail); 
ft.addToBackStack(TAG); 
ft.commit(); 

Nadzieja pomaga to, że ktoś chce wiedzieć, w jaki sposób, aby zobaczyć solidne tło bez zmiany dodatku do zastąpienia, co zwykle nie jest najlepszym rozwiązaniem.

Pozdrowienia

+3

To rzeczywiście powinna być poprawna odpowiedź, ponieważ poprzednia wymaga jawnie funkcji "zamień", zamiast pozostać niezależną od implementacji. – HBN

+1

Stwierdziłem, że jest to poprawna odpowiedź, ponieważ nawet jeśli użycie zastępowania fragmentu, który zastępowałem, nadal było przepuszczane, dopóki nie zrobiłem tła nieprzejrzystego na innym fragmencie. Dziękuję Ci! – crowmagnumb

+0

korzysta z wymiany lepiej pod względem szybkości i/lub zużycia pamięci? również obie metody będą musiały obsłużyć utratę stanu (co oznacza konieczność zapisania danych w saveInstance), prawda? –

3

użyłem wiele technik, ale nie zysk końcu naprawiłem go dodając tło pojemnika lub układ fragment jak ten

android:background="@android:color/white"  

wystarczy dodać w układzie albo widok kontenera z ciebie Fragment Mam nadzieję, że pomoże

Powiązane problemy