2012-03-28 13 views
7

मेरे पास लैंडस्केप मोड के लिए एक लेआउट है जो बाईं ओर एक सूची दृश्य और दाईं ओर एक फ्रेमलाउट दिखाता है। एक आइटम की सूची से चयनित किया जाता है तो एक और टुकड़ा FrameLayout में जोड़ा जाता हैफ्रेमलेआउट से एक टुकड़ा नहीं हटा सकता है?

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
    myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commitAllowingStateLoss(); 
} 

बाद में मैं सूची दृश्य में हटा सकते हैं और सूची में अंतिम आइटम को निकालने दबाएँ, और मैं इतना है कि कुछ भी नहीं टुकड़ा दूर करने की कोशिश दिखाया गया है, लेकिन यह काम नहीं करता है, मेरा टुकड़ा स्क्रीन पर बना हुआ है। हटाने के लिए कोड है:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.remove(myFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
ft.commitAllowingStateLoss(); 

कोई विचार क्यों इसे दृश्य से हटाया नहीं जा रहा है?

+3

मुझे एक ही समस्या है। क्या कोई संकल्प पूरा हो गया है? – Jared

उत्तर

3

क्या आप एक्सएमएल में खंड घोषित कर रहे हैं? Google से डियान हैकबर्न का हवाला देते हुए:

एक्सएमएल में खंडों को परिभाषित करना ज्यादातर चीजों के लिए है जो आसपास रहने जा रहे हैं। यदि आप जोड़ने और निकालने जा रहे हैं, तो आपको शायद इसे गतिशील रूप से लगातार करना चाहिए।

आशा है कि यह

+0

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

+0

वैसे यह एपीआई सिर्फ खराब है। आप एक सरल 'निकालें()' कॉल करते हैं, और जिस मूल चीज को आप करने की उम्मीद कर रहे थे वह काम नहीं करता है। – milosmns

+0

यह आपके द्वारा बनाई गई स्पष्ट लेनदेन के साथ जोड़े गए टुकड़ों के लिए काम करता है, प्रोग्रामेटिक रूप से। – Blackbelt

0

में मदद करता है जब आप आईडी द्वारा आपका टुकड़ा खोजने आप टुकड़ा कंटेनर का संदर्भ मिला ही खंड नहीं। एक टैग जब तुम टुकड़ा addiing और उसके बाद टैग द्वारा खोजने का उपयोग करें:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag"); 
11

@DaveJohnston मैं निकालें टुकड़ा के लिए अपने कोड की कोशिश की है मैं सिर्फ ढाला .... धन्यवाद :)

अरे मैं यह जानता हूँ न आपकी समस्या है या नहीं का हल है, लेकिन आप इस तरह की कोशिश यह काम करेगा: जोड़ने के लिए

दृष्टिकोण टुकड़ा:

YourFragment yourFrament; 

//Add your Fragment 
public void addYourFragment(){ 
yourFragment = new YourFragment(); 

FragmentTransaction transation = getSupportFragmentManager().beginTransaction(); 
transation.replace(R.id.yourFlowLayout, yourFragment); 

     transation.commit(); 

} 

दृष्टिकोण टुकड़ा दूर करने के लिए:

//Remove Fragment 
    public void removeYourFragment(){ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      if (yourFragment != null) {   
       transaction.remove(yourFragment); 
       transaction.commit(); 
       transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
       yourFragment = null; 
      } 
    } 
+0

यदि मैं लेनदेन लिखता हूं तो क्या होगा .remove (शून्य)? क्या यह ढेर में सबसे ज्यादा टुकड़ा हटा देगा? या क्या होगा? –

0

मैं एक अतः इस मुद्दे जब नहीं XML के माध्यम से <fragment> की स्थापना, लेकिन वास्तव में FragmentTransaction और <FrameLayout> साथ गतिशील रूप से हर Fragment की स्थापना होने वाली करने के लिए संदर्भ खोजने एक बहुत ही मुश्किल समय था।

ग्रू के समाधान को सरल बनाना, मेरे लिए यह हल किया गया था कि यह मेरे प्रतिस्थापन लेनदेन में .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) जोड़ रहा था और यह काम किया! पिछले टुकड़े अब वास्तव में देखने से छिपे हुए हैं।

मुझे लगता है कि अन्य संक्रमण भी काम करेंगे।

0
private static String TAG_FRAGMENT="MyFragment"; 
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
     myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment,TAG_FRAGMENT); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(TAG_FRAGMENT); 
    ft.commit(); 
} 

जब आसानी से अपने टुकड़ा हटाने के बाद ft.addToBackStack(null) विधि का उपयोग करने के लिए अपने टुकड़ा की जगह।

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 

if(fragment != null) 
getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 
0

आप एक Fragment कि FrameLayout में Fragment की जगह पर नहीं हटाया जाता है है, तो? आप नियमित प्रतिस्थापन प्रतिबद्धता के लिए कॉल से पहले FragmentTransaction.TRANSIT_FRAGMENT_CLOSE के साथ एक अलग हटाने संक्रमण करके इसे हटा सकते हैं।

Fragment removeThisFragment;//Keep a reference to the fragment you want to remove 
... 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

// This fragment "sometimes" do not get replaced so we remove it here if it's added. 
     if(removeThisFragment!=null&&removeThisFragment.isAdded()) { 
      transaction = fragmentManager.beginTransaction(); 
      transaction.remove(removeThisFragment); 
      transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
      transaction.commitAllowingStateLoss(); 
     } 

     // update the main content by replacing fragments 
     transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, TAG_MAIN_FRAGMENT).commit(); 

लेकिन मैं कोशिश करते हैं और यह पता लगाने के लिए पहले क्यों टुकड़ा पहली जगह में जगह नहीं है करने के लिए, जाँच का सुझाव अगर यह कुछ भारी काम कर रहा है या कुछ और की जगह होने से यह रखने ?? लेकिन अगर आपको त्वरित अस्थायी फिक्स की आवश्यकता है तो उपर्युक्त कोड आज़माएं।

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