5

Używam Google API 8 (Android 2.2) z pakietami v4.ViewPager inside Fragment znika po transaction.remove() (Zachowaj instancję?)

Cześć, tu jest mój problem:

Mam FragmentActivity zawierającej menu, które zawsze pozostaje na ekranie i małym pojemniku (a FrameLayout), gdzie mogę umieścić wiele fragmentów. Moja aplikacja działa dobrze, gdy ukrywam i pokazuję fragmenty, ale zawiesza się po załadowaniu wszystkich fragmentów, ponieważ mam ograniczoną pamięć do użycia. W tym przypadku musiałem usunąć niektóre fragmenty podczas ładowania innych, więc aplikacja się nie zawiesza. Ale pojawia się kolejny problem, moje pagery nie ładują się ponownie po ich usunięciu, wszystkie pozostałe fragmenty działają poprawnie. Tylko moje pagery nie pokazują się, nie psują się, po prostu znikają. Tu idzie jakiś kod, aby dać wskazówkę co mój problem jest o:

MyFragmentActivity.java ma ten układ:

<LinearLayout 

     ...(some code from menu that doesn't matter) 

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

W tym FrameLayout, umieścić wszystkie moje fragmenty. Fragmenty pager jest jednym z nich, a jego układ wygląda następująco:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v4.view.ViewPager 
     android:id="@+android:id/some_pager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
</LinearLayout> 

I wdrożone tej klasy abstrakcyjnej AbstractPagerFragment:

import java.util.List; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public abstract class AbstractPagerFragment extends Fragment { 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     View fragment = inflater.inflate(getLayoutID(), container,false); 
     PagerAdapter mPagerAdapter = initializePager(); 
     ViewPager pager = (ViewPager) fragment.findViewById(getPagerID()); 
     pager.setAdapter(mPagerAdapter); 
     return fragment; 
    } 

    private PagerAdapter initializePager() { 
     PagerAdapter mPagerAdapter = new templateDigital.util.PagerAdapter(getFragmentManager(), getFragments()); 
     return mPagerAdapter; 

    } 

    public abstract List<Fragment> getFragments(); 

    public abstract int getLayoutID(); 

    public abstract int getPagerID(); 

} 

ta wykorzystuje moje PagerAdapter, który wygląda tak:

import java.util.List; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class PagerAdapter extends FragmentPagerAdapter{ 

    private List<Fragment> fragments; 

    public PagerAdapter(FragmentManager fManager, List<Fragment> fragments) { 
     super(fManager); 
     this.fragments = fragments; 
    } 


    @Override 
    public Fragment getItem(int position) { 
     return fragments.get(position); 
    } 


    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 
} 

Teraz zaimplementuj moją AbstractPagerFrag ment:

import templateDigital.main.R; 
import templateDigital.util.fragments.AbstractPagerFragment; 
import templateDigital.util.fragments.GenericFragment; 
import android.support.v4.app.Fragment; 

public class ConcretePagerFragment extends AbstractPagerFragment { 

    private List<Fragment> fragments; 

    public ConcretePagerFragment() { 
     fragments = new ArrayList<Fragment>(); 
     fragments.add(new GenericFragment(R.layout.concept_page1_fragment)); 
     fragments.add(new GenericFragment(R.layout.concept_page2_fragment)); 
     fragments.add(new GenericFragment(R.layout.concept_page3_fragment)); 

     //GenericFragments is a class that extends Fragments and just inflate a layout with a background image. 
    } 

    @Override 
    public List<Fragment> getFragments() { 
     return fragments; 
    } 

    @Override 
    public int getLayoutID() { 
     return R.layout.pager_fragment; 
    } 

    @Override 
    public int getPagerID() { 
     return R.id.some_pager; // the pager inside the layout 
    } 
} 

Dobra, teraz dodam go z moich treści (FrameLayout) tak (myFragment jest PagerFragment i MyTag jest ciąg, który reprezentuje swój znacznik zdefiniowanej przeze mnie):

FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    if (fragmentManager.findFragmentByTag(myTag) == null) { 
     transaction.add(R.id.content,myFragment, myTag); 
    } 

    transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
    hideAllOtherFragments(myTag, transaction); //Here I hide all other fragments, the code is okay. Trust me. 
    transaction.show(myFragment()); 
    transaction.commit(); 

I to jak usunę go:

... 
transaction.remove(myFragment); 
... 

Ale kiedy powinien załadować ponownie po tym, jak poruszać się z powrotem do fragmentu w menu, stosując tę ​​samą metodę użyłem w czasie pierwszego (kod Abov e), pagera już się nie pokazuje. Czy ktoś może rozwiązać ten problem?

Jeśli czytasz to wszystko, dziękuję, jesteś mistrzem.

+0

Ta praca dla mnie: http://stackoverflow.com/a/14505469/959086 spróbuj zaimplementować ten kod w swojej aplikacji – Kenumir

Odpowiedz

0

Właściwie, jeśli chcesz wprowadzić ViewPager z fragmentów, należy dodać TabHost, a TabWidget FrameLayout i ViewPager.

TabHost będzie kontenerem widoku okna z zakładkami. Ten obiekt zawiera dwoje elementów podrzędnych: zestaw etykiet zakładek, które użytkownik klika, aby wybrać określoną kartę, a obiekt FrameLayout jest obiektem wyświetlającym zawartość tej strony. A potem trzeba stworzyć TabAdapter (czyli coś w swoim PagerAdapter) i dodać fragmenty dla każdej karcie wywołując mTabsAdapter.addTab i wysyłanie fragment jako parametr

Zrobiłem post about it, gdzie mogę wyjaśnić, jak zintegrować Fragments i ViewPager. Mam nadzieję, że to pomoże.

+0

Dlaczego musisz dodać TabHost? W Twoim poście nie wyjaśniono, dlaczego jest on wymagany. – Jeremy

Powiązane problemy