2012-01-30 9 views
10

एंड्रॉइड दस्तावेज़ों में टुकड़ों का उपयोग करने पर example में, जब एप्लिकेशन 'ड्यूलव्यू' मोड में होता है, तो विवरण खंड को फिर से बनाया जाता है जब एप्लिकेशन को एक अलग शीर्षक के लिए विवरण दिखाने की आवश्यकता होती है। FragmentTransaction.replace() का उपयोग प्रत्येक पुराने विवरण खंड को एक नए के साथ स्वैप करने के लिए किया जाता है।नए उदाहरण बनाने के बजाय टुकड़े अपडेट करने के लिए ठीक है?

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

उदाहरण के मामले में, इसका मतलब DetailsFragment.setShownIndex() की रेखाओं के साथ एक विधि होगा। इसे DetailsFragment पुनर्निर्माण के बजाय, नए शीर्षक सूचकांक में गुजरना कहा जाएगा।

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

इसका संभवतः चिपचिपा परिणाम यह होगा कि, जब शीर्षक खंड resumed राज्य (यानी 'अग्रभूमि' में) में होता है, तो शीर्षक का चयन करने पर परिणामस्वरूप DetailsFragment.setShownIndex() पर कॉल किया जाएगा जब विवरण खंड में है stopped राज्य।

अच्छा विचार? बुरा विचार?

अग्रिम धन्यवाद।

उत्तर

5

जैसा कि आपने कहा था, नए टुकड़े टुकड़े बनाने का मुख्य कारण बैक स्टैक का उपयोग करने में आसानी के लिए है। मौजूदा फ्रैगमेंट का पुन: उपयोग करना भी पूरी तरह से सुरक्षित है (इसे FragmentManager.findFragmentById() या FragmentManager.findFragmentByTag() का उपयोग करके देख रहा है)। कभी-कभी आपको isVisible(), isRemoving() आदि जैसे फ्रैगमेंट विधियों का अच्छा उपयोग करने की आवश्यकता होगी ताकि DetailsFragmentstopped पर अवैध रूप से यूआई घटकों का संदर्भ न दें।

अपने प्रस्तावित एकल फलक गतिविधि में

वैसे भी 2 टुकड़े के साथ, अपने setShownIndex विधि DetailsFragment जो onCreateView या onActivityCreated में लोड किया जाता है में एक निजी क्षेत्र सेट कर सकते हैं। जब DetailsFragment कंटेनर में जोड़ दी जाती

जैसे

DetailsFragment df = getFragmentManager().findFragmentByTag("details"); 
if (df != null) { 
    df.setShownIndex(getSelectedIndex()); 
} else { 
    df = DetailsFragment.newInstance(getSelectedIndex()); 
} 
fragmentTransaction.replace(R.id.frame, df, "details").commit(); 

दोनों ही मामलों में, चाहे df नव निर्मित या पुन: उपयोग किया जाता है, onCreateView और onActivityCreated बुलाया जाएगा।

लेकिन यदि आप बैक स्टैक चाहते हैं, तो मैं अत्यधिक नए उदाहरण बनाने की अत्यधिक अनुशंसा करता हूं, अन्यथा आप DetailsFragment की सामग्री के लिए अपना खुद का बैक स्टैक लागू कर रहे हैं।

0

मैं निम्नलिखित कोड की कोशिश की है और यह मेरे लिए काम करता है:

public static boolean isFragmentInBackstack(final android.support.v4.app.FragmentManager fragmentManager, final String fragmentTagName) { 
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) { 
     if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) { 
      return true; 
     } 
    } 
    return false; 
} 

मैं आशा है कि मैं तुम्हें

मदद कर सकता है: यदि टुकड़ा StackBack में पहले से ही है इस समारोह को अंजाम

private void replaceFragment(Class fragmentClass, String FRAGMENT_NAME, android.support.v4.app.FragmentManager fragmentManager) { 

    Fragment fragment = null; 
    String backStateName = fragmentClass.getName(); // nome della classe del Fragment 

    Log.d("Fragment: ", "Creazione Fragment: "+backStateName); 


    Boolean fragmentExit = isFragmentInBackstack(fragmentManager, backStateName); 


    if (fragmentExit) { //Il Fragment è presente nello stacback 

     // Fragment exists, go back to that fragment 
     //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow 
     fragmentManager.popBackStackImmediate(fragmentClass.getName(), 0); 

    } else { 

     // se non esiste lo aggiungiamo 
     try { 
      fragment = (Fragment) fragmentClass.newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Inizializzo la transazione del Fragment 
     android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction(); 
     ft.setCustomAnimations(
       R.anim.fragment_slide_left_enter, 
       R.anim.fragment_slide_left_exit, 
       R.anim.fragment_slide_right_enter, 
       R.anim.fragment_slide_right_exit); 
     ft.replace(R.id.frameLayout_contentMain, fragment, FRAGMENT_NAME); 
     ft.addToBackStack(fragmentClass.getName()); 
     ft.commit(); 

     // Recupero il numero di Fragment presenti 
     Integer nFragment = fragmentManager.getBackStackEntryCount(); 

     Log.d("Fragment: ", "Numero di Fragment: "+nFragment); 

    } 

} 

निर्धारित करने के लिए

+0

अधिक उपयोगी होगा अगर आपने अंग्रेजी –

+0

में टिप्पणियां प्रदान की हैं तो मुझे खेद है। मैं इतालवी हूं। –

संबंधित मुद्दे