java - स्क्रीन रोटेशन बदलने पर ViewPager खंड गायब हो जाते हैं




android android-fragments (4)

आपको getFragmentManager() बजाय getChildFragmentManager() उपयोग करना चाहिए। आपने इस्तेमाल किया

mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager());

इसे होना चाहिए था

mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getChildFragmentManager());

आपके टुकड़े में

मैं एंड्रॉइड एप्लिकेशन पर काम कर रहा हूं जिसमें Fragment एस के साथ ViewPager शामिल है, इस तरह:

MainActivity ( MainActivityFragment ( screenSlideViewPager ( Fragment एस)), जिसका अर्थ है:

Activity में Fragment शामिल है ViewPager में Fragment एस है

अब मेरी समस्या तब होती है जब डिवाइस घुमाएं या स्क्रीन रोटेशन बदलें, ViewPager में सभी टुकड़े गायब हो गए हैं।

इस मुद्दे को हल करने के लिए कोई विचार?

संपादित करें 1

MainActivity.java:

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

    if (getSupportFragmentManager().findFragmentByTag(TAG) == null) {
        final FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
        ft.add(android.R.id.content, new MainActivityFragment(), TAG);
        ft.commit();
    }
}

MainActivityFragment.java:

public class MainActivityFragment extends Fragment {
    private ViewPager mPager = null;
    private PagerAdapter mPageAdapter = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View reVal = inflater.inflate(R.layout.activity_main, container, false);
        mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent);
        mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager());
        mPager.setAdapter(mPageAdapter);
        return reVal;
    }

    private MainGridViewFragment mainGridFragment;
    private AlphabetGridViewFragment alphabetGridFragment;

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public android.app.Fragment getItem(int position) {
            switch (position) {
                case 1:
                    mainGridFragment = new MainGridViewFragment();
                    return mainGridFragment;
                case 0:
                    alphabetGridFragment = new AlphabetGridViewFragment();
                    return alphabetGridFragment;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}

संपादित करें 2

स्पष्ट रूप से MainActivity और MainActivityFragment लोड हो जाती है, और सबूत MainActivityFragment है, यह भी ध्यान दें कि ViewPager भी लोड हो गया है, क्योंकि आप अभी भी पृष्ठों के बीच नेविगेट कर सकते हैं (नीली रोशनी का अर्थ है कि पेजर अंतिम पृष्ठ तक पहुंच गया है) लेकिन आप इसकी सामग्री नहीं देख सकते ।


ऐसा लगता है कि आपकी मुख्य गतिविधि getSupportFragmentManager () का उपयोग कर रही है, जबकि आपका टुकड़ा getFragmentManager () का उपयोग कर रहा है।

सुनिश्चित नहीं है कि यह उत्तर पोस्ट के योग्य है लेकिन मेरी रेटिंग किसी अन्य तरीके से उत्तर देने के लिए बहुत कम है। :)

संपादित करें: मेरा मानना ​​है कि आपको सहायता लाइब्रेरी के साथ एक फ्रैगमेंट एक्टिविटी बढ़ाने की भी आवश्यकता हो सकती है।

देखें: https://.com/a/10609839/2640693

2 संपादित करें:

public class MainActivityFragment extends FragmentActivity {
    private ViewPager mPager = null;
    private PagerAdapter mPageAdapter = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View reVal = inflater.inflate(R.layout.activity_main, container, false);
        mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent);
        mPageAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
        mPager.setAdapter(mPageAdapter);
        return reVal;
    }

    private MainGridViewFragment mainGridFragment;
    private AlphabetGridViewFragment alphabetGridFragment;

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 1:
                    mainGridFragment = new MainGridViewFragment();
                    return (Fragment)mainGridFragment;
                case 0:
                    alphabetGridFragment = new AlphabetGridViewFragment();
                    return (Fragment)alphabetGridFragment;
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 2;
        }
    }
}

फिर से दर्शक को बनाने से बचें। OnCreateView पर कोड बनाएं ()। और अपने टुकड़े का उपयोग रीटेन इंस्टेंस (सत्य) पर करें। इसलिए यह खंड को फिर से नहीं बनाएगा क्योंकि दृश्य ऑनक्रेट () में है, इसे दोबारा नहीं बुलाया जाएगा।

ऑनक्रेट व्यू () में जांचें कि क्या दृश्य मौजूद है, यदि ऐसा है तो इसे हटा दें। स्निपेट्स:

//creates the view
private View createView(Bundle savedInstanceState) {
    View view = getActivity().getLayoutInflater().inflate(your_layout, null, false);

    //viewpager

    return view;
}

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

    //retains fragment instance across Activity re-creation
    setRetainInstance(true);

    viewRoot = createView(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    if (viewRoot != null && viewRoot.getParent() != null) {
        ViewGroup parent = (ViewGroup) viewRoot.getParent();
        parent.removeView(viewRoot);

        Log.i("Test", "**************view.getParent(): " + viewRoot.getParent() + "    " + viewRoot);
    }

    return viewRoot;
}

मुझे यह वही समस्या थी। यह बेहद उलझन में है, लेकिन इस धागे ने मुझे मदद की, सिवाय इसके कि जवाब वास्तव में यह नहीं बताते कि यह क्यों काम करता है।

इस समस्या का समाधान Fragment.getChildFragmentManager() का उपयोग करना है। इतना भ्रमित है कि एंड्रॉइड एपीआई में Activity.getFragmentManager() , लेकिन यदि आप पुराने उपकरणों का समर्थन करने की कोशिश कर रहे हैं तो आपको Activity.getSupportFragmentManager() का उपयोग करने की आवश्यकता है। हालांकि, यह विशेष समस्या पुरानी एपीआई का समर्थन करने के बारे में नहीं है।

समस्या यह है कि आपके पास एक ऐसी गतिविधि है जिसमें एक टुकड़ा है जो व्यूपेजर का मालिक है, जिसमें कई टुकड़े हैं। आप टुकड़ों के भीतर टुकड़े हैं! टुकड़ों के मूल डिजाइन ने वास्तव में इस उपयोग के मामले को संभाला नहीं था और बाद में इसे संभालने के लिए अद्यतन किया गया था। जब आपके पास टुकड़ों के टुकड़े होते हैं तो आपको इसका उपयोग करने की आवश्यकता होती है:

Fragment.getChildFragmentManager()

एक Fragment भीतर से आपके पास Fragment.getFragmentManager() की पसंद है जो Activity बनाम Fragment.getChildFragmentManager() का FragmentManager लौटाता है जो इस FragmentManager लिए Fragment जो आपके Fragment भीतर Fragment s को ठीक से स्कॉप्स करता है।





android-viewpager