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 को ठीक से स्कॉप्स करता है।