दिलचस्प पोस्ट
अग्रणी अंडरस्कोर के साथ आईओएस में संश्लेषित गुणों का नाम क्यों बदलें? मैं एक पाठ फ़ाइल के एन्कोडिंग / कोडपेज का पता कैसे लगा सकता हूं? प्रमुख जावा एचटीएमएल पार्सरों के पेशेवरों और विपक्ष क्या हैं? Uintptr_t डेटा प्रकार क्या है PHP के साथ बेस यूआरएल कैसे प्राप्त करें? मोंगोज में कैस्केड शैली को हटा दें मैं अपाचे के साथ दर को कैसे लागू कर सकता हूं? (प्रति सेकंड अनुरोध) क्या यह मानना ​​सुरक्षित है कि एसटीएल वेक्टर भंडारण हमेशा सम्मिलित है? नमूना http रेंज अनुरोध सत्र Seedable जावास्क्रिप्ट यादृच्छिक संख्या जनरेटर कैसे स्ट्रिंग इनपुट एक संख्या है की जांच करने के लिए? कोनेरी 2 घटक में बाहरी सीएसएस शैली लोड करें यूआरएल से .html कैसे निकालें ओडीबीसी के बिना जावा से ऐक्सेस डाटाबेस को जोड़ना एवीटी के बिना जावा जीयूआई श्रोताओं

FragmentPagerAdapter का समर्थन पुराने टुकड़े के लिए संदर्भ रखता है

नवीनतम जानकारी:

मैंने अपनी समस्या को कम कर दिया है, फ्रैगमेंट के साथ समस्या होने के कारण मैनेजर को पुराने टुकड़ों के उदाहरणों को बरकरार रखना और मेरे दृश्यपटल मेरे फ्रैग्मेंट मैनेजर के साथ सिंक्रनाइज़ेशन से बाहर हो रहे हैं। यह समस्या देखें … http://code.google.com/p/android/issues/detail?id=19211#makechanges मुझे अभी भी कोई सुराग नहीं है कि यह कैसे हल करे। कोई सुझाव…

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

List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this, Fragment1.class.getName())); ... new PagerAdapter(getSupportFragmentManager(), fragments); 

कार्यान्वयन मानक है। मैं फ्रेगमेंट्स के लिए ActionBarSherlock और v4 computability लायब्रेरी का उपयोग कर रहा हूं।

मेरी समस्या यह है कि एप छोड़ने और कई अन्य एप्लिकेशन खोलने और वापस आ जाने के बाद, टुकड़े अपने संदर्भ को फ्रैगमेंट getActivity() == null यानी getActivity() == null ) में वापस खो देते हैं। मैं समझ नहीं सकता कि ऐसा क्यों हो रहा है मैंने मैन्युअल रूप से setRetainInstance(true); सेट करने की कोशिश की setRetainInstance(true); लेकिन यह मदद नहीं करता है मुझे लगा कि यह तब होता है जब मेरा टुकड़ा गतिविधि नष्ट हो जाती है, हालांकि यह तब भी होता है जब मैं लॉग संदेश प्राप्त करने से पहले ऐप खोलता हूं क्या कोई विचार है?

 @Override protected void onDestroy(){ Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY"); super.onDestroy(); } 

एडेप्टर:

 public class PagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragments; public PagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); this.fragments = fragments; } @Override public Fragment getItem(int position) { return this.fragments.get(position); } @Override public int getCount() { return this.fragments.size(); } } 

मेरे टुकड़ों में से एक ने छीन लिया, लेकिन मैंने उन सभी को छीन लिया और अभी भी काम नहीं किया …

 public class MyFragment extends Fragment implements MyFragmentInterface, OnScrollListener { ... @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); handler = new Handler(); setHasOptionsMenu(true); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.w(TAG,"ATTACHATTACHATTACHATTACHATTACH"); context = activity; if(context== null){ Log.e("IS NULL", "NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL"); }else{ Log.d("IS NOT NULL", "NOTNOTNOTNOTNOTNOTNOTNOT"); } } @Override public void onActivityCreated(Bundle savedState) { super.onActivityCreated(savedState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.my_fragment,container, false); return v; } @Override public void onResume(){ super.onResume(); } private void callService(){ // do not call another service is already running if(startLoad || !canSet) return; // set flag startLoad = true; canSet = false; // show the bottom spinner addFooter(); Intent intent = new Intent(context, MyService.class); intent.putExtra(MyService.STATUS_RECEIVER, resultReceiver); context.startService(intent); } private ResultReceiver resultReceiver = new ResultReceiver(null) { @Override protected void onReceiveResult(int resultCode, final Bundle resultData) { boolean isSet = false; if(resultData!=null) if(resultData.containsKey(MyService.STATUS_FINISHED_GET)){ if(resultData.getBoolean(MyService.STATUS_FINISHED_GET)){ removeFooter(); startLoad = false; isSet = true; } } switch(resultCode){ case MyService.STATUS_FINISHED: stopSpinning(); break; case SyncService.STATUS_RUNNING: break; case SyncService.STATUS_ERROR: break; } } }; public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); inflater.inflate(R.menu.activity, menu); } @Override public void onPause(){ super.onPause(); } public void onScroll(AbsListView arg0, int firstVisible, int visibleCount, int totalCount) { boolean loadMore = /* maybe add a padding */ firstVisible + visibleCount >= totalCount; boolean away = firstVisible+ visibleCount <= totalCount - visibleCount; if(away){ // startLoad can now be set again canSet = true; } if(loadMore) } public void onScrollStateChanged(AbsListView arg0, int state) { switch(state){ case OnScrollListener.SCROLL_STATE_FLING: adapter.setLoad(false); lastState = OnScrollListener.SCROLL_STATE_FLING; break; case OnScrollListener.SCROLL_STATE_IDLE: adapter.setLoad(true); if(lastState == SCROLL_STATE_FLING){ // load the images on screen } lastState = OnScrollListener.SCROLL_STATE_IDLE; break; case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: adapter.setLoad(true); if(lastState == SCROLL_STATE_FLING){ // load the images on screen } lastState = OnScrollListener.SCROLL_STATE_TOUCH_SCROLL; break; } } @Override public void onDetach(){ super.onDetach(); if(this.adapter!=null) this.adapter.clearContext(); Log.w(TAG, "DETACHEDDETACHEDDETACHEDDETACHEDDETACHEDDETACHED"); } public void update(final int id, String name) { if(name!=null){ getActivity().getSupportActionBar().setTitle(name); } } 

}

अपडेट विधि को तब कहा जाता है जब कोई उपयोगकर्ता भिन्न टुकड़ा के साथ संपर्क करता है और getActivity नल वापस कर रहा है। यहाँ एक अन्य टुकड़ा बुला रही विधि है …

 ((MyFragment) pagerAdapter.getItem(1)).update(id, name); 

मेरा मानना ​​है कि जब ऐप नष्ट हो जाता है तो ऐप को शुरू होने के बजाय ऐप को शुरू करने के बजाय ऐप्प शुरू होता है और फिर आखिरी ज्ञात पृष्ठ पर नेविगेट करता है। यह अजीब लगता है, क्या ऐप सिर्फ डिफ़ॉल्ट टुकड़े तक लोड नहीं होना चाहिए?

वेब के समाधान से एकत्रित समाधान "FragmentPagerAdapter का समर्थन पुराने टुकड़े के लिए संदर्भ रखता है"

आप एक समस्या में चल रहे हैं क्योंकि आप PagerAdapter.getItem बाहर अपने टुकड़ों के संदर्भ और रख-रखाव कर रहे हैं, और उन संदर्भों को स्वतंत्र रूप से ViewPager से उपयोग करने का प्रयास कर रहे हैं। जैसा कि सराफ कहते हैं, आपके पास गारंटी है कि किसी विशेष समय पर एक विखंडन में एक टुकड़ा इन्स्तांत / जोड़ा गया है – इस पर एक कार्यान्वयन विवरण माना जाना चाहिए। एक ViewPager अपने पृष्ठों के आलसी लोडिंग करता है; डिफ़ॉल्ट रूप से यह केवल वर्तमान पृष्ठ को लोड करता है, और एक को छोड़ दिया और दाएं

यदि आप अपना ऐप पृष्ठभूमि में रखते हैं, तो टुकड़े जो कि टुकड़े प्रबंधक में जोड़े गए हैं स्वचालित रूप से सहेजे जाते हैं। यहां तक ​​कि अगर आपके ऐप को मार डाला गया है, तो यह जानकारी तब बहाल हो जाएगी जब आप अपने ऐप को पुन: लॉन्च करेंगे

अब विचार करें कि आपने कुछ पन्नों, टुकड़े ए, बी और सी को देखा है। आप जानते हैं कि ये टुकड़ा प्रबंधक को जोड़ा गया है। क्योंकि आप FragmentPagerAdapter का उपयोग कर रहे हैं और नहीं FragmentStatePagerAdapter , ये टुकड़े अब भी जोड़ा जाएगा (लेकिन संभावित रूप से अलग) जब आप अन्य पृष्ठों पर स्क्रॉल करते हैं

मान लें कि आप अपने आवेदन की पृष्ठभूमि में हैं, और फिर इसे मार डाला जाता है जब आप वापस आते हैं, तो एंड्रॉइड याद रखेगा कि आप टुकड़े प्रबंधक में फ्रैग्मेंट्स ए, बी और सी इस्तेमाल करते हैं और इसलिए यह आपके लिए उन्हें पुन: बनाता है और फिर उन्हें जोड़ता है हालांकि, जो लोग टुकड़ा मैनेजर में जोड़े गए हैं, वे अब आपकी गतिविधियों में आपके टुकड़ों की सूची में नहीं हैं।

फ्रैग्मेंटपेगर getPosition को कॉल करने का प्रयास नहीं करेगा, अगर उस पृष्ठ की स्थिति के लिए पहले से ही एक टुकड़ा जोड़ा गया है। वास्तव में, क्योंकि एंड्रॉइड द्वारा बनाए गए टुकड़े को कभी भी हटाया नहीं जाएगा, आपको इसे प्राप्त करने के लिए कॉल करने की कोई getPosition । उस पर एक संभाल लेना भी एक संदर्भ प्राप्त करने के लिए बहुत मुश्किल है क्योंकि यह एक टैग के साथ जोड़ा गया था जो आपको अज्ञात है। यह डिजाइन द्वारा है; आप उन टुकड़ों के साथ गड़बड़ करने से हतोत्साहित होते हैं, जिन्हें देखें पेजर प्रबंध कर रहा है। आपको अपने सभी कार्यों को एक टुकड़ा के भीतर, गतिविधि से संप्रेषण करना, और यदि आवश्यक हो, किसी विशेष पृष्ठ पर स्विच करने का अनुरोध करना चाहिए।

अब, लापता गतिविधि के साथ अपनी समस्या पर वापस। pagerAdapter.getItem(1)).update(id, name) कॉल pagerAdapter.getItem(1)).update(id, name) यह सब हुआ है pagerAdapter.getItem(1)).update(id, name) बाद pagerAdapter.getItem(1)).update(id, name) आपको अपनी सूची में टुकड़े लौटाता है, जो अब तक टुकड़ा मैनेजर में जोड़ा जा रहा है , और इसलिए इसमें कोई गतिविधि संदर्भ नहीं होगा। मुझे पता होगा कि आपकी अपडेट पद्धति में कुछ साझा डेटा संरचना (संभवतः गतिविधि द्वारा प्रबंधित) को बदलना चाहिए, और फिर जब आप किसी विशेष पृष्ठ पर जाते हैं तो यह इस अद्यतन डेटा के आधार पर स्वयं को आकर्षित कर सकता है।

मुझे सरल समाधान मिला जो मेरे लिए काम किया।

अपने टुकड़े एडाप्टर को FragmentStatePagerAdapter के बजाय FragmentPagerAdapter और ओवरराइड विधि पर फैलता है।

 @Override public Parcelable saveState() { return null; } 

यह एंड्रॉइड को टुकड़ा पुनः बनाने से रोकता है


एक दिन बाद में मुझे एक और बेहतर समाधान मिला।

अपने सभी टुकड़ों के लिए कॉल setRetainInstance(true) और उन्हें कहीं और संदर्भों को बचाएं मैंने अपनी गतिविधि में स्थिर वैरिएबल में ऐसा किया, क्योंकि इसे एकल टास्क घोषित किया गया है और टुकड़े हर समय समान रह सकते हैं।

इस तरह एंड्रॉइड टुकड़ों को फिर से नहीं बनाते हैं, लेकिन उसी उदाहरण का उपयोग करते हैं।

मैंने अपने टुकड़ों को सीधे टुकड़ों तक पहुंचने के द्वारा इस समस्या का समाधान किया है, जैसे कि फ्रैग्मेंटपेगर एडाप्टर के बजाय फ्रैगमेंट मैनेजर के द्वारा। सबसे पहले मुझे फ्रैगमेंटपेगर एडाप्टर द्वारा उत्पन्न टुकड़ा ऑटो का टैग पता करने की आवश्यकता है …

 private String getFragmentTag(int pos){ return "android:switcher:"+R.id.viewpager+":"+pos; } 

तो मैं बस उस टुकड़े के संदर्भ को प्राप्त करता हूं और मुझे ऐसा करना पड़ता है …

 Fragment f = this.getSupportFragmentManager().findFragmentByTag(getFragmentTag(1)); ((MyFragmentInterface) f).update(id, name); viewPager.setCurrentItem(1, true); 

अपने टुकड़ों के अंदर मैं सेट सेट setRetainInstance(false); ताकि मैं सहेजे गए इन्स्टैंसस्टेट बंडल में मैन्युअल रूप से मूल्य जोड़ सकूं।

 @Override public void onSaveInstanceState(Bundle outState) { if(this.my !=null) outState.putInt("myId", this.my.getId()); super.onSaveInstanceState(outState); } 

और फिर ओनक्रेट में मैंने उस कुंजी को पकड़ लिया और आवश्यकतानुसार टुकड़े की स्थिति को पुनर्स्थापित किया। एक आसान समाधान जो कठिन था (कम से कम मेरे लिए) पता लगाने के लिए

वैश्विक कार्य परीक्षण समाधान

getSupportFragmentManager() कुछ समय के लिए रिक्त संदर्भ रखता है और पेजर देखें क्योंकि यह एक ही टुकड़ा के संदर्भ को खोजने के लिए नया नहीं बनाता है। इतने पर आने के लिए यह उपयोग getChildFragmentManager() सरल तरीके से समस्या को हल करती है।

ऐसा मत करो:

new PagerAdapter(getSupportFragmentManager(), fragments);

यह करो:

new PagerAdapter(getChildFragmentManager() , fragments);

ViewPager में टुकड़ों के बीच बातचीत करने का प्रयास न करें। आप यह गारंटी नहीं दे सकते कि अन्य टुकड़ा जुड़ा हुआ है या यहां तक ​​कि मौजूद है। टुकड़े से बदलते एक्शनबार शीर्षक के बदले, आप इसे अपनी गतिविधि से कर सकते हैं। इस के लिए स्टैंटेन्ट इंटरफ़ेस पैटर्न का प्रयोग करें:

 public interface UpdateCallback { void update(String name); } public class MyActivity extends FragmentActivity implements UpdateCallback { @Override public void update(String name) { getSupportActionBar().setTitle(name); } } public class MyFragment extends Fragment { private UpdateCallback callback; @Override public void onAttach(SupportActivity activity) { super.onAttach(activity); callback = (UpdateCallback) activity; } @Override public void onDetach() { super.onDetach(); callback = null; } public void updateActionbar(String name) { if(callback != null) callback.update(name); } } 

एक समान मुद्दे की तलाश के कुछ घंटों के बाद मुझे लगता है कि एक और समाधान है। यह एक कम से कम मेरे लिए काम किया है और मुझे केवल कुछ पंक्तियों को बदलना होगा।

यह मेरी समस्या है, मेरे पास एक दृश्य पेजर के साथ एक गतिविधि है जो दो टुकड़ों के साथ एक फ्रैगमेंटस्टेटपरगर एडाप्टर का उपयोग करता है। सब कुछ ठीक काम करता है जब तक कि मैं गतिविधि को नष्ट करने के लिए मजबूर करता हूं (डेवलपर विकल्प) या मैं स्क्रीन को घुमाए मैं दो टुकड़ों के संदर्भ को रखने के बाद विधि getItem के अंदर बनाए जाते हैं

उस समय गतिविधि को फिर से बनाया जाएगा और इस बिंदु पर सबकुछ ठीक काम करेगा, लेकिन मैंने अपने fragmetns के संदर्भ को खो दिया है क्योंकि GetItem को फिर से नहीं कहा जाता है।

इस तरह से मैं FragmentStatePagerAdapter के अंदर उस समस्या को ठीक करता हूं:

  @Override public Object instantiateItem(ViewGroup container, int position) { Object aux = super.instantiateItem(container, position); //Update the references to the Fragments we have on the view pager if(position==0){ fragTabOne = (FragOffersList)aux; } else{ fragTabTwo = (FragOffersList) aux; } return aux; } 

यदि आपको एडॉप्टर का आंतरिक रूप से आंतरिक संदर्भ मिल गया है, तो आपको GetItem पर कॉल नहीं मिलेगी, और आपको उसे बदलना नहीं चाहिए। इसके बजाए आप इस टुकड़े को प्राप्त करने के लिए इस दूसरे विधि को तत्काल इटैम () देखकर उपयोग कर सकते हैं, जिसे आपके प्रत्येक टुकड़े के लिए कहा जाएगा

उम्मीद है कि किसी को भी मदद करता है

दृश्यपेज को नष्ट करते समय आप टुकड़ों को निकाल सकते हैं, मेरे मामले में, मैंने उन्हें अपने टुकड़े के onDestroyView() पर हटा दिया है:

 @Override public void onDestroyView() { if (getChildFragmentManager().getFragments() != null) { for (Fragment fragment : getChildFragmentManager().getFragments()) { getChildFragmentManager().beginTransaction().remove(fragment).commitAllowingStateLoss(); } } super.onDestroyView(); } 

चूंकि फ्रैगमेंट मैनेजर आपके लिए अपने टुकड़े को पुनर्स्थापन करने का ख्याल रखेगा, जैसे कि रीस्यूम () विधि कहलाता है कि मेरे पास इस खंड को गतिविधि को बुलाते हैं और खुद को एक सूची में जोड़ते हैं मेरे उदाहरण में मैं यह सब मेरे पेजर एडाप्टर कार्यान्वयन में संग्रहीत कर रहा हूं। प्रत्येक टुकड़ा उसे स्थिति जानता है क्योंकि यह निर्माण पर तुल्य तर्कों में जोड़ा जाता है। अब जब भी मुझे एक विशेष अनुक्रमणिका पर किसी टुकड़े को हेरफेर करने की ज़रूरत है, तो मुझे अपने एडेप्टर से सूची का उपयोग करना होगा।

निम्न एक एडाप्टर का एक कस्टम व्यूपॉगर के लिए उदाहरण है, जो फोकस को बढ़ता है, क्योंकि यह फ़ोकस में चलता है, और इसे नीचे पैमाने के रूप में फ़ोकस से बाहर निकलता है एडाप्टर और फ्रेगमेंट कक्षाओं के अतिरिक्त, मुझे यहां आपकी ज़रूरत है, अभिभावक गतिविधि के लिए एडेप्टर चर का संदर्भ देने में सक्षम होने के लिए और आप सेट हैं।

अनुकूलक

 public class GrowPagerAdapter extends FragmentPagerAdapter implements OnPageChangeListener, OnScrollChangedListener { public final String TAG = this.getClass().getSimpleName(); private final int COUNT = 4; public static final float BASE_SIZE = 0.8f; public static final float BASE_ALPHA = 0.8f; private int mCurrentPage = 0; private boolean mScrollingLeft; private List<SummaryTabletFragment> mFragments; public int getCurrentPage() { return mCurrentPage; } public void addFragment(SummaryTabletFragment fragment) { mFragments.add(fragment.getPosition(), fragment); } public GrowPagerAdapter(FragmentManager fm) { super(fm); mFragments = new ArrayList<SummaryTabletFragment>(); } @Override public int getCount() { return COUNT; } @Override public Fragment getItem(int position) { return SummaryTabletFragment.newInstance(position); } @Override public void onPageScrollStateChanged(int state) {} @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { adjustSize(position, positionOffset); } @Override public void onPageSelected(int position) { mCurrentPage = position; } /** * Used to adjust the size of each view in the viewpager as the user * scrolls. This provides the effect of children scaling down as they * are moved out and back to full size as they come into focus. * * @param position * @param percent */ private void adjustSize(int position, float percent) { position += (mScrollingLeft ? 1 : 0); int secondary = position + (mScrollingLeft ? -1 : 1); int tertiary = position + (mScrollingLeft ? 1 : -1); float scaleUp = mScrollingLeft ? percent : 1.0f - percent; float scaleDown = mScrollingLeft ? 1.0f - percent : percent; float percentOut = scaleUp > BASE_ALPHA ? BASE_ALPHA : scaleUp; float percentIn = scaleDown > BASE_ALPHA ? BASE_ALPHA : scaleDown; if (scaleUp < BASE_SIZE) scaleUp = BASE_SIZE; if (scaleDown < BASE_SIZE) scaleDown = BASE_SIZE; // Adjust the fragments that are, or will be, on screen SummaryTabletFragment current = (position < mFragments.size()) ? mFragments.get(position) : null; SummaryTabletFragment next = (secondary < mFragments.size() && secondary > -1) ? mFragments.get(secondary) : null; SummaryTabletFragment afterNext = (tertiary < mFragments.size() && tertiary > -1) ? mFragments.get(tertiary) : null; if (current != null && next != null) { // Apply the adjustments to each fragment current.transitionFragment(percentIn, scaleUp); next.transitionFragment(percentOut, scaleDown); if (afterNext != null) { afterNext.transitionFragment(BASE_ALPHA, BASE_SIZE); } } } @Override public void onScrollChanged(int l, int t, int oldl, int oldt) { // Keep track of which direction we are scrolling mScrollingLeft = (oldl - l) < 0; } } 

टुकड़ा

 public class SummaryTabletFragment extends BaseTabletFragment { public final String TAG = this.getClass().getSimpleName(); private final float SCALE_SIZE = 0.8f; private RelativeLayout mBackground, mCover; private TextView mTitle; private VerticalTextView mLeft, mRight; private String mTitleText; private Integer mColor; private boolean mInit = false; private Float mScale, mPercent; private GrowPagerAdapter mAdapter; private int mCurrentPosition = 0; public String getTitleText() { return mTitleText; } public void setTitleText(String titleText) { this.mTitleText = titleText; } public static SummaryTabletFragment newInstance(int position) { SummaryTabletFragment fragment = new SummaryTabletFragment(); fragment.setRetainInstance(true); Bundle args = new Bundle(); args.putInt("position", position); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); mRoot = inflater.inflate(R.layout.tablet_dummy_view, null); setupViews(); configureView(); return mRoot; } @Override public void onViewStateRestored(Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); if (savedInstanceState != null) { mColor = savedInstanceState.getInt("color", Color.BLACK); } configureView(); } @Override public void onSaveInstanceState(Bundle outState) { outState.putInt("color", mColor); super.onSaveInstanceState(outState); } @Override public int getPosition() { return getArguments().getInt("position", -1); } @Override public void setPosition(int position) { getArguments().putInt("position", position); } public void onResume() { super.onResume(); mAdapter = mActivity.getPagerAdapter(); mAdapter.addFragment(this); mCurrentPosition = mAdapter.getCurrentPage(); if ((getPosition() == (mCurrentPosition + 1) || getPosition() == (mCurrentPosition - 1)) && !mInit) { mInit = true; transitionFragment(GrowPagerAdapter.BASE_ALPHA, GrowPagerAdapter.BASE_SIZE); return; } if (getPosition() == mCurrentPosition && !mInit) { mInit = true; transitionFragment(0.00f, 1.0f); } } private void setupViews() { mCover = (RelativeLayout) mRoot.findViewById(R.id.cover); mLeft = (VerticalTextView) mRoot.findViewById(R.id.title_left); mRight = (VerticalTextView) mRoot.findViewById(R.id.title_right); mBackground = (RelativeLayout) mRoot.findViewById(R.id.root); mTitle = (TextView) mRoot.findViewById(R.id.title); } private void configureView() { Fonts.applyPrimaryBoldFont(mLeft, 15); Fonts.applyPrimaryBoldFont(mRight, 15); float[] size = UiUtils.getScreenMeasurements(mActivity); int width = (int) (size[0] * SCALE_SIZE); int height = (int) (size[1] * SCALE_SIZE); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height); mBackground.setLayoutParams(params); if (mScale != null) transitionFragment(mPercent, mScale); setRandomBackground(); setTitleText("Fragment " + getPosition()); mTitle.setText(getTitleText().toUpperCase()); mLeft.setText(getTitleText().toUpperCase()); mRight.setText(getTitleText().toUpperCase()); mLeft.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mActivity.showNextPage(); } }); mRight.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mActivity.showPrevPage(); } }); } private void setRandomBackground() { if (mColor == null) { Random r = new Random(); mColor = Color.rgb(r.nextInt(255), r.nextInt(255), r.nextInt(255)); } mBackground.setBackgroundColor(mColor); } public void transitionFragment(float percent, float scale) { this.mScale = scale; this.mPercent = percent; if (getView() != null && mCover != null) { getView().setScaleX(scale); getView().setScaleY(scale); mCover.setAlpha(percent); mCover.setVisibility((percent <= 0.05f) ? View.GONE : View.VISIBLE); } } @Override public String getFragmentTitle() { return null; } } 

मेरा समाधान: मैंने लगभग हर दृश्य static रूप में सेट किया अब मेरा ऐप पूरी तरह से इंटरैक्ट करता है। हर जगह से स्थिर तरीकों को कॉल करने में सक्षम होने के नाते शायद एक अच्छी शैली नहीं है, लेकिन कोड के साथ खेलने के लिए जो काम नहीं करता है? मैंने बहुत सारे प्रश्न और उनके उत्तर यहां पर पढ़ा और कोई समाधान नहीं लाया (मेरे लिए)

मुझे पता है कि यह स्मृति को रिसाव कर सकता है, और ढेर का ढेर कर सकता है, और मेरा कोड अन्य परियोजनाओं पर फिट नहीं होगा, लेकिन मुझे इसके बारे में डर नहीं लगता – मैंने विभिन्न उपकरणों और स्थितियों पर ऐप का परीक्षण किया, कोई समस्या नहीं, एंड्रॉइड प्लेटफॉर्म को यह संभालना सक्षम लगता है। यूआई को हर दूसरे और एक एस 2 आईसीएस (4.0.3) डिवाइस पर भी रीफ़्रेश किया जाता है जिससे ऐप हज़ारों भू-मार्कर्स को संभालने में सक्षम है।

मुझे एक ही समस्या का सामना करना पड़ा लेकिन मेरे ViewPager एक TopFragment के अंदर था जो setAdapter(new FragmentPagerAdapter(getChildFragmentManager())) एडाप्टर setAdapter(new FragmentPagerAdapter(getChildFragmentManager())) का उपयोग करके एक एडेप्टर बनाया और सेट किया था।

मैंने इस समस्या को onAttachFragment(Fragment childFragment) ओवरराइड करके तय किया है:

 @Override public void onAttachFragment(Fragment childFragment) { if (childFragment instanceof OnboardingDiamondsFragment) { mChildFragment = (ChildFragment) childFragment; } super.onAttachFragment(childFragment); } 

जैसा कि पहले से ही ज्ञात है (उपरोक्त उत्तर देखें), जब बच्चा संरेखण प्रबंधक खुद को पुन: निर्मित करता है, तो यह उन टुकड़ों को भी बना देता है जो व्यू पृष्ठ में होते थे।
महत्वपूर्ण हिस्सा यह है कि उसके बाद, वह अटैचफ्रैगमेंट पर कॉल करता है और अब हमारे पास नए निर्मित टुकड़े का एक संदर्भ है!

आशा है कि यह मेरे जैसे पुराने क्यू को प्राप्त करने में मदद करेगा 🙂

मैंने स्प्रेसेअरे में टुकड़ों को बचाने के द्वारा समस्या हल की:

 public abstract class SaveFragmentsPagerAdapter extends FragmentPagerAdapter { SparseArray<Fragment> fragments = new SparseArray<>(); public SaveFragmentsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); fragments.append(position, fragment); return fragment; } @Nullable public Fragment getFragmentByPosition(int position){ return fragments.get(position); } }