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.
Ta praca dla mnie: http://stackoverflow.com/a/14505469/959086 spróbuj zaimplementować ten kod w swojej aplikacji – Kenumir