दिलचस्प पोस्ट
क्या रैवल्यू के संदर्भ झूलते संदर्भों की अनुमति देते हैं? ओरेकल में एक तालिका में डुप्लिकेट वैल्यू कैसे प्राप्त करूं? कई 'if else' स्टेटमेंट को क्लीनर दृष्टिकोण में परिवर्तित करना 0 और 9 के बीच यादृच्छिक पूर्णांक उत्पन्न करें एंड्रॉइड पर अपने माता-पिता के लिए onClick ईवेंट कैसे पास करें? सी # मेमोरी एड्रेस और वेरिएबल ऑरेकल में अनुक्रम। एनटेवल के साथ टेबल बनाएं मैं WPF / WP7 में एक सूची बॉक्स में तारों की सूची कैसे बाँट सकता हूं? पायथन में कोशिश-छोड़कर-दूसरे का उपयोग करने के लिए क्या यह एक अच्छा अभ्यास है? क्या मैं केवल एक div की पृष्ठभूमि की छवि के लिए एक अस्पष्टता सेट कर सकता हूँ? एक कस्टम संपादन प्रकार फ़ील्ड में एकाधिक इनपुट तत्व जोड़ें .NET में संरचना और कक्षा के बीच अंतर क्या है? जावा में String.split () के साथ सीमांकक के रूप में मैं "" कैसे उपयोग कर सकता हूं जावास्क्रिप्ट में हर एन वर्ण के बाद मैं एक चरित्र कैसे सम्मिलित कर सकता हूं? गतिशील प्रोग्रामिंग और मेमोअनाइजेशन: नीचे-अप बनाम टॉप-डाउन दृष्टिकोण

एंड्रॉइड खंड- एक टुकड़े में विचारों के राज्यों को कैसे बचाया जाए, जब दूसरे टुकड़े को इसके ऊपर धकेल दिया जाता है

एंड्रॉइड में, एक टुकड़ा ( FragA कहते हैं) को FragA जोड़ा जाता है और दूसरा टुकड़ा ( FragB कहते हैं) शीर्ष पर आता है अब वापस मारने पर FragA शीर्ष पर आता है और FragA onCreateView() कहा जाता है। FragA शीर्ष पर धक्का दिया पहले अब मैं एक विशेष राज्य में FragA था

मेरा प्रश्न है कि कैसे मैं अपने पिछले राज्य में FragA को पुनर्स्थापित कर सकता हूँ? क्या राज्य को बचाने का एक तरीका है (जैसे कि एक बंडल में कहते हैं) और यदि ऐसा है तो मुझे किस पद्धति को ओवरराइड करना चाहिए?

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड खंड- एक टुकड़े में विचारों के राज्यों को कैसे बचाया जाए, जब दूसरे टुकड़े को इसके ऊपर धकेल दिया जाता है"

टुकड़ा गाइड में FragmentList उदाहरण आप पा सकते हैं:

 @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("curChoice", mCurCheckPosition); } 

जो आप इस तरह बाद में उपयोग कर सकते हैं:

 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { // Restore last state for checked position. mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); } } 

मैं टुकड़ों में शुरुआत कर रहा हूं, लेकिन यह आपकी समस्या के समाधान की तरह लगता है;) पिछला स्टैक से टुकड़ा रिटर्न के बाद ऑनएक्टिविटी क्रय किया जाता है।

फ्रेगमेंट की onSaveInstanceState(Bundle outState) को तब तक नहीं बुलाया जाएगा, जब तक कि टुकड़ा की गतिविधि अपने आप पर कॉल न करे और संलग्न टुकड़े इस प्रकार इस विधि को तब तक नहीं बुलाया जाएगा जब तक कुछ (आमतौर पर रोटेशन) बल गतिविधि SaveInstanceState को वापस SaveInstanceState और इसे बाद में SaveInstanceState लेकिन अगर आपके पास केवल एक ही गतिविधि है और उसमें बड़े टुकड़े के टुकड़े ( replace गहन उपयोग के साथ) और एप्लिकेशन केवल एक ओरिएंटेशन गतिविधि पर onSaveInstanceState(Bundle outState) को लंबे समय तक नहीं बुलाया जा सकता है।

मुझे पता है तीन संभावित हलचल

सबसे पहला:

महत्वपूर्ण डेटा रखने के लिए टुकड़ा के तर्क का उपयोग करें:

 public class FragmentA extends Fragment { private static final String PERSISTENT_VARIABLE_BUNDLE_KEY = "persistentVariable"; private EditText persistentVariableEdit; public FragmentA() { setArguments(new Bundle()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, null); persistentVariableEdit = (EditText) view.findViewById(R.id.editText); TextView proofTextView = (TextView) view.findViewById(R.id.textView); Bundle mySavedInstanceState = getArguments(); String persistentVariable = mySavedInstanceState.getString(PERSISTENT_VARIABLE_BUNDLE_KEY); proofTextView.setText(persistentVariable); view.findViewById(R.id.btnPushFragmentB).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getFragmentManager() .beginTransaction() .replace(R.id.frameLayout, new FragmentB()) .addToBackStack(null) .commit(); } }); return view; } @Override public void onPause() { super.onPause(); String persistentVariable = persistentVariableEdit.getText().toString(); getArguments().putString(PERSISTENT_VARIABLE_BUNDLE_KEY, persistentVariable); } } 

दूसरा, लेकिन कम पेंडेंटिक तरीका – सिंगलटन में वेरिएबल को पकड़ो

तीसरा – replace() टुकड़े को replace() नहीं करते हैं, लेकिन इसके बजाय add() / show() / hide()

ध्यान दें कि यदि आप देखेंगगर का उपयोग करते हुए टुकड़ों के साथ काम करते हैं, तो यह बहुत आसान है। आपको केवल इस विधि को कॉल करना होगा: setOffscreenPageLimit()

डॉक्स के लिए Accordign:

उन पृष्ठों की संख्या निर्धारित करें, जिन्हें किसी निष्क्रिय स्थिति में दृश्य पदानुक्रम में वर्तमान पृष्ठ के दोनों तरफ बनाए रखा जाना चाहिए। इस सीमा से परे की गई पतों को जब जरूरत पड़ने पर एडाप्टर से बनाया जाएगा

Simmilar मुद्दा यहां

बस एक बार के लिए अपने दृश्य फुलाओ

उदाहरण निम्न है:

 public class AFragment extends Fragment { private View mRootView; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(mRootView==null){ mRootView = inflater.inflate(R.id.fragment_a, container, false); //...... } return mRootView; } 

}

मैंने इस मुद्दे के साथ काम किया। चूंकि मुझे पता था कि मैं अक्सर पिछली हिस्से में वापस लौट रहा था, मैंने यह देखने के लिए चेक किया था कि क्या टुकड़ा .isAdded() सच था, और यदि हां, तो transaction.replace() करने की .isAdded() transaction.replace() मैं सिर्फ एक transaction.show() करता हूं। .isAdded() transaction.show() । यह टुकड़ा पुन: निर्मित होने से रखता है अगर यह पहले से ही स्टैक पर है – कोई राज्य बचत की आवश्यकता नहीं है

 Fragment target = <my fragment>; FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); if(target.isAdded()) { transaction.show(target); } else { transaction.addToBackStack(button_id + "stack_item"); transaction.replace(R.id.page_fragment, target); } transaction.commit(); 

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

 android:configChanges="orientation|screenSize" 

Android 3.0 और उच्चतर में, screenSize जाहिरा तौर पर आवश्यक है।

सौभाग्य

मैंने पाया सबसे अच्छा समाधान नीचे है:

onSavedInstanceState (): हमेशा आंतरिक टुकड़ा कहा जाता है जब गतिविधि बंद हो रही है (गतिविधि को एक से दूसरे स्थानांतरित करने के लिए या config परिवर्तन) इसलिए यदि हम एक ही गतिविधि पर कई टुकड़े बुला रहे हैं तो हमें निम्नलिखित दृष्टिकोण का उपयोग करना होगा:

टुकड़े के OnDestroyView () का उपयोग करें और उस वस्तु के अंदर संपूर्ण वस्तु को बचाएं। फिर ऑनएक्टिवेटिव (): जांचें कि यदि ऑब्जेक्ट रिक्त है या नहीं (क्योंकि यह विधि हर बार कॉल करता है) अब एक ऑब्जेक्ट की स्थिति को यहां पुनर्स्थापित करें।

इसकी हमेशा काम करता है!

यदि आप इस तरह के एंड्रॉयड मेनिफेस्ट में निर्दिष्ट अपने टुकड़ा गतिविधि में कॉन्फ़िगरेशन परिवर्तन को संभाल रहे हैं

 <activity android:name=".courses.posts.EditPostActivity" android:configChanges="keyboardHidden|orientation" android:screenOrientation="unspecified" /> 

तब टुकड़े के onSaveInstanceState को लागू नहीं किया जाएगा और onSaveInstanceState गए onSaveInstanceState ऑब्जेक्ट हमेशा रिक्त हो जाएगा।

 private ViewPager viewPager; viewPager = (ViewPager) findViewById(R.id.pager); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBar.setSelectedNavigationItem(position); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } 

मैं एक दृश्य दृश्य वाले टुकड़ों के लिए एक हाइब्रिड दृष्टिकोण का उपयोग किया। ऐसा प्रतीत होता है क्योंकि मैं वर्तमान टुकड़ा को बदल नहीं सकता बल्कि नए टुकड़े को जोड़ता हूं और वर्तमान को छिपता हूं। मुझे अपने टुकड़े को होस्ट करने वाली गतिविधि में निम्न विधि है:

 public void addFragment(Fragment currentFragment, Fragment targetFragment, String tag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(0,0,0,0); transaction.hide(currentFragment); // use a fragment tag, so that later on we can find the currently displayed fragment transaction.add(R.id.frame_layout, targetFragment, tag) .addToBackStack(tag) .commit(); } 

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

 FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); SearchFragment currentFragment = (SearchFragment) fragmentManager.findFragmentByTag(getFragmentTags()[0]); DetailsFragment detailsFragment = DetailsFragment.newInstance("some object containing some details"); ((MainActivity) getActivity()).addFragment(currentFragment, detailsFragment, "Details"); 

getFragmentTags() स्ट्रिंग की एक सरणी देता है जो मैं अलग टुकड़ों के लिए टैग के रूप में उपयोग करता हूं जब मैं एक नया टुकड़ा जोड़ता हूं (ऊपर addFragment विधि में transaction.add विधि देखें)।

टुकड़ा में सूची देखने वाले, मैं इसे इसके परस्थित करें () विधि:

 @Override public void onPause() { // keep the list view's state in memory ("save" it) // before adding a new fragment or replacing current fragment with a new one ListView lv = (ListView) getActivity().findViewById(R.id.listView); mListViewState = lv.onSaveInstanceState(); super.onPause(); } 

फिर खंड के क्रिएटिव्यू में (वास्तव में एक तरीका जो कि क्रिएटिव्यू में लागू किया गया है) में, मैं राज्य को पुनर्स्थापित करता हूं:

 // Restore previous state (including selected item index and scroll position) if(mListViewState != null) { Log.d(TAG, "Restoring the listview's state."); lv.onRestoreInstanceState(mListViewState); } 

मैं नहीं सोचता onSaveInstanceState कि onSaveInstanceState एक अच्छा समाधान है। यह सिर्फ गतिविधि के लिए उपयोग किया गया था जो destoryed गया था

एंड्रॉइड 3.0 से फ्रैगमेन फ्रैगमेंट मैनेजर के प्रबंधक रहे हैं, यह स्थिति है: एक गतिविधि मैपिंग मैनी टुकड़े, जब टुकड़े को जोड़ दिया जाता है (बैकस्टैक्स में नहीं बदलता है: इसे पुनः निर्मित किया जाएगा), दृश्य को नष्ट किया जाएगा। जब पिछले एक से वापस, यह पहले के रूप में प्रदर्शित करेगा

तो मुझे लगता है कि यह संभाल करने वाला टुकड़ा प्रबंधक और लेनदेन बहुत अच्छा है।

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