5

मेरे पास नीचे नेविगेशन टैब के साथ एक गतिविधि है जो इसमें टुकड़े बदल रही है। जब मैं उन टैब पर आगे और आगे क्लिक करता हूं, तो कुछ बिंदु पर यह काम करना बंद कर देता है। कोड ठीक ठीक निष्पादित करता है क्योंकि मैंने इसमें कुछ लॉग डाल दिए हैं। लेकिन टुकड़े स्विच नहीं किए जा रहे हैं।FragmentTransaction hide/show कभी-कभी काम नहीं करता

कोड kotlin में है, लेकिन यह नहीं बल्कि सीधे आगे

fun showTabFragment(tag: String) { 
     val currentFragment: Fragment? = supportFragmentManager.fragments?.lastOrNull() 
     var fragment = supportFragmentManager.findFragmentByTag(tag) 
     val fragmentExists = fragment != null 
     if (fragment == null) { 
      when (tag) { 
       TAG_LOGBOOK -> fragment = LogbookFragment() 
       TAG_RECIPES -> fragment = RecipesFragment() 
       TAG_PROFILE -> fragment = ProfileFragment() 
       else -> fragment = MeetingPlacesFragment() 
      } 
     } 

     val transaction = supportFragmentManager.beginTransaction() 

     if (currentFragment != null) { 
      Log.i("jacek", "hiding " + currentFragment.javaClass.simpleName) 
      transaction.hide(currentFragment) 
     } 

     if (fragmentExists) { 
      Log.i("jacek", "showing " + fragment.javaClass.simpleName) 
      transaction.show(fragment) 
     } else { 
      Log.i("jacek", "adding " + fragment.javaClass.simpleName) 
      transaction.add(R.id.container, fragment, tag) 
     } 

     transaction.commit() 
    } 

टुकड़े काफी भारी हैं। मैं कुछ हल्के लोगों के साथ प्रयास करूंगा, लेकिन फिर भी मेरी राय में कोई समस्या नहीं होनी चाहिए। क्या मैं कुछ और कोशिश कर सकता हूं?

मैं नवीनतम समर्थन लाइब्रेरी का उपयोग कर रहा हूँ - 25.2.0 इसके अलावा, मैं टुकड़े की जगह में कोई दिलचस्पी नहीं हूँ बिंदु के रूप में उन्हें पुनः बनाने के बिना crossfade एनीमेशन जोड़ने के लिए है

+0

हो सकता है कि वहाँ एक समस्या है जब आप कॉल यह एक और रास्ता दिखाने/अपने टुकड़े को छिपाने के लिए है एक ही लेनदेन के भीतर एक ही टुकड़े पर 'छुपाएं() 'और फिर' दिखाएं() '? जैसे कि 'वर्तमान फ्रैगमेंट'' टुकड़े 'के समान टुकड़ों को संदर्भित करता है, जो निश्चित रूप से यहां हो सकता है। इसके बारे में बात करते हुए, मुझे लगता है कि यह दावा करना गलत है कि 'supportFragmentManager.fragments' सूची में अंतिम खंड अंतिम दिखाया गया टुकड़ा होगा (बल्कि हाल ही में जोड़ा गया एक)। आपको या तो सभी 'टुकड़ों' के माध्यम से फिर से शुरू करना चाहिए और उस व्यक्ति की खोज करें जिसमें 'दृश्यमान() 'सत्य है या केवल अंतिम दिखाए गए टुकड़े टैग को स्टोर करें और इसे बाद में ढूंढें। –

उत्तर

1

समस्या यहां भले ही आप है ' "वर्तमान" खंड छिपाने के लिए, स्मृति में लोड अन्य टुकड़े हैं और यह असंगत व्यवहार देता है।

आप जो टुकड़ा दिखाना चाहते हैं उसे छोड़कर आप सभी टुकड़े छुपाकर इसे ठीक करने में सक्षम होना चाहिए।

इस उत्तर के लिए धन्यवाद। Show hide fragment in android

जैसे:

private FragmentA fragmentA; 
private FragmentB fragmentB; 
private FragmentC fragmentC; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    fragmentA = FragmentA.newInstance(); 
    fragmentB = FragmentB.newInstance(); 
    fragmentC = FragmentC.newInstance(); 

} 

protected void displayFragmentA() { 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
    if (fragmentA.isAdded()) { 
     ft.show(fragmentA); 
    } else { 
     ft.add(R.id.fragement_container, fragmentA); 
    } 

    if (fragmentB.isAdded()) { ft.hide(fragmentB); } 

    if (fragmentC.isAdded()) { ft.hide(fragmentC); } 

    ft.commit(); 
} 

इसी तरह आप displayFragmentB() और displayFragmentC()

1

@ अली के जवाब अच्छा है, अभी तक कल्पना अगर आप 5 टुकड़े के लिए काम करता है लिखने के लिए होगा।

// in BaseFragment 
    public abstract String getTAG(); 

    //in FragmentA, FragmentB and FragmentC 
    public String getTAG(){ 
     return TAG; 
    } 

    //Activity containing the fragments 
    //android.support.v4.app.Fragment;  
    private FragmentA fragmentA; //inherited BaseFragment 
    private FragmentB fragmentB; //inherited BaseFragment 
    private FragmentC fragmentC; //inherited BaseFragment 
    private ConcurrentHashMap<String,BaseFragment> mapOfAddedFragments = new ConcurrentHashMap<>(); 


    /** 
    * Displays fragment A 
    */ 
    private void displayFragmentA() { 
     displayFragment(fragmentA) 
    } 

    /** 
    * Displays fragment B 
    */ 
    private void displayFragmentB() { 
     displayFragment(fragmentB) 
    } 

    /** 
    * Displays fragment C 
    */ 
    private void displayFragmentC() { 
     displayFragment(fragmentC) 
    } 


    /** 
    * Loads a fragment using show a fragment 
    * @param fragment 
    */ 
    private void displayFragment(BaseFragment fragment){ 
     if(!mapOfAddedFragments.containsKey(fragment.getTAG())) 
      mapOfAddedFragments.put(fragment.getTAG(), fragment); 

     showFragment(fragment.getTAG(), R.id.containerBody); 
    } 

    /** 
    * Displays a fragment and hides all the other ones 
    * @param fragmentTag is the tag of the fragment we want to display 
    */ 
    private void showFragment(String fragmentTag, @IdRes int containerViewId){ 
     FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); 
     BaseFragment fragment = null; 

     fragment = mapOfAddedFragments.get(fragmentTag); 
     if(fragment != null) { 
      if (fragment.isAdded()) 
       ft.show(fragment); 
      else { //fragment needs to be added to the frame container 
       ft.add(containerViewId, fragment, fragment.getTAG()); 
      } 
     } 
     else //the chosen fragment doesn't exist 
      return; 

     //we hide the other fragments 
     for (ConcurrentHashMap.Entry<String, BaseFragment> entry : mapOfAddedFragments.entrySet()){ 
      if(!entry.getKey().equals(fragmentTag)){ 
       BaseFragment fragmentTemp = entry.getValue(); 
       // Hide the other fragments 
       if(fragmentTemp != null) 
        if(fragmentTemp.isAdded()) 
         ft.hide(fragmentTemp); 
      } 
     } 

     //commit changes 
     ft.commit(); 
    } 

और उनमें का दृष्टांत को आप onCreate में ऐसा कर सकते हैं() अपनी गतिविधि की विधि:

//don't forget to get the .TAG elsewhere before using them here 
    //never call them directly 
    private void instantiateFragments(Bundle inState) { 
     if (inState != null) { 
      fragmentA = inState.containsKey(FragmentA.TAG) ? 
        (FragmentA) getSupportFragmentManager().getFragment(inState, FragmentA.TAG): 
        FragmentA.newInstance(FragmentA.TAG,"0"); 

      fragmentB = inState.containsKey(FragmentB.TAG) ? 
        (FragmentB) getSupportFragmentManager().getFragment(inState, FragmentB.TAG): 
        FragmentB.newInstance(FragmentB.TAG,"1");   

      fragmentc = inState.containsKey(FragmentC.TAG) ? 
        (FragmentC) getSupportFragmentManager().getFragment(inState, FragmentC.TAG): 
        FragmentC.newInstance(FragmentC.TAG,"2");   
     } 
     else{ 
      fragmentA = FragmentA.newInstance(FragmentA.TAG,"0"); 
      fragmentB = FragmentB.newInstance(FragmentB.TAG,"1"); 
      fragmentc = FragmentC.newInstance(FragmentC.TAG,"2"); 
     } 
    } 
संबंधित मुद्दे