2016-12-15 9 views
6

मैं fragmentTransaction.replace() का उपयोग करके एक फ्रेम के साथ फ़्रेमलेआउट को प्रतिस्थापित करता हूं।एंड्रॉइड - fragmentTransaction.replace() समर्थन लाइब्रेरी पर काम नहीं करता है 25.1.0

लेआउट:

<FrameLayout 
     android:id="@+id/articlesAppender" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
</FrameLayout> 

गतिविधि के onCreate में बदलना:

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
articlesFragment = (ArticlesFragment) fragmentManager.findFragmentByTag(ARTICLES_FRAGMENT_TAG); 

if (articlesFragment == null) { 
    articlesFragment = new ArticlesFragment(); 
} 

fragmentTransaction.replace(R.id.articlesAppender, articlesFragment, ARTICLES_FRAGMENT_TAG); 
fragmentTransaction.commit(); 

ArticleFragment के onCreate:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.articles_fragment, container, false); 
    view.setVisibility(View.GONE); 
    return view; 
} 

लेकिन view.setVisibility(View.GONE); समर्थन पुस्तकालय 25.1.0 पर काम नहीं कर रहा है। तो टुकड़ा अभी भी स्क्रीन पर प्रदर्शित किया जाएगा। यदि मैंने articlesAppender से GONE की दृश्यता सेट की है। , अभी भी नहीं काम करता है

<FrameLayout 
     android:id="@+id/articlesAppender" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:visibility="gone"> 
</FrameLayout> 

फिर टुकड़ा स्क्रीन पर नहीं दिखाई देंगे, लेकिन जब मैं view.setVisibility(View.VISIBLE); बाद में फोन करने की कोशिश यह: तो यह इस तरह दिखना चाहिए। खंड अभी भी दिखाई नहीं दे रहा है।

इसका मतलब है view जो inflater.inflate(R.layout.articles_fragment, container, false); द्वारा वापस किया गया है, खंड का असली दृश्य नहीं है। लेकिन यह समर्थन पुस्तकालय 25.0.1 पर पूरी तरह से काम करता है।

तो यह एंड्रॉइड की बग है?

+0

आप टुकड़ा के साथ फ्रेम लेआउट को बदलने के लिए करना चाहते हैं? –

+0

आप इस निष्कर्ष पर कैसे पहुंचे कि प्रतिस्थापन() विधि काम नहीं कर रही है? यदि आप फुफ्फुस दृश्य के बजाय उस खंड लेआउट में मुख्य रूट तत्व पर दृश्यता (View.GONE) सेट करने का प्रयास करते हैं, तो क्या यह अभी भी काम नहीं कर रहा है? – Gil

+0

@ ऋषभमहाथा हां, मैं इसे बदलना चाहता हूं। @Gil क्योंकि यह समर्थन पुस्तकालय 25.0.1 पर काम करता है।और मैंने अपने प्रश्न में स्थिति का वर्णन किया है। मुझे लेख एपेंडर की दृश्यता सीधे सेट करना है। इसका मतलब है कि यह प्रतिस्थापित नहीं है। फुलाया दृश्य मूल तत्व है, इसलिए मैं इस दृश्य को 'onCreateView()' में वापस भेजता हूं। –

उत्तर

7

अंक की सूचना दी गई है। और अधिक लोगों को इस मुद्दे

https://code.google.com/p/android/issues/detail?id=230191

+0

मुझे आशा है कि वे इस समस्या को हल करेंगे – MiloRambaldi

+3

और यह केवल एकमात्र नहीं है। जब आप 2 विचारों को स्वैप करते हैं तो वे अब एक अलग उत्तराधिकार में चलते हैं और आगे बढ़ते हैं। इसलिए, हमें शायद अभी तक 25.0.1 तक रहना चाहिए। – Dmitry

+1

"विकास दल ने इस मुद्दे को ठीक कर दिया है" क्योंकि उनके अपराह्न ने https://code.google.com/p/android/issues/detail?id=230526&q=AppCompat%2025.1.0&colspec=ID%20Status%20Priority%20Owner% 20 सारांश% 20 स्टार्स% 20 रिपोर्टर% 20 ओपन – MiloRambaldi

-1
//replace fragment 
    private void replaceFragment(final Fragment newFragment, final int containerId) { 
     final FragmentManager fragmentManager = getFragmentManager(); 
     final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(containerId, newFragment, newFragment.getClass().getSimpleName()); 
     fragmentTransaction.commit(); 
    } 

ArticleFragment के onCreate:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.articles_fragment, container, false); 
       return view; 
    } 

    <FrameLayout 
      android:id="@+id/articlesAppender" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
    </FrameLayout> 

बस अपने MainActivity onCreate में इस विधि कॉल() कहाँ

newFreagment = "टुकड़ा आप के साथ बदलना चाहते हैं" containerId = " Framelayout आईडी "

2

यह रूप में गिलिस Haasnoot की पोस्ट में बताया गया है, एक सूचना बग प्रतीत हो रहा है दिखा रहा है।

मैंने देखा कि यदि मैं प्रतिस्थापित() को हटाकर() में जोड़ता हूं और जोड़ता हूं(), और commitNow() का उपयोग करता हूं तो यह अपेक्षा के अनुसार काम करता है।

मूल कोड (25.1.0 के साथ शुरू विफल रहता है):

fragMngr.beginTransation() 
    .replace(R.id.detail_container, newFrag, fragTag) 
    .commit(); 

काम के आसपास:

// remove old fragment 
Fragment oldFrag = fragMngr.findFragmentByTag(fragTag); 
if (oldFrag != null { 
    fragMngr.beginTransaction().remove(oldFrag).commitNow(); 
} 

// add new fragment 
fragMngr.beginTransaction() 
    .add(R.id.detail_container, newFrag, fragTag) 
    .commitNow(); 
+0

ठीक है; लेकिन लगता है कि आपके पास वास्तव में एक बड़ी परियोजना है जिसका उपयोग बहुत से टुकड़े लेनदेन में किया जाता है। CommitNow() संरचनाओं के साथ सभी प्रतिबद्ध() संरचनाओं को बदलने के लिए तार्किक नहीं है। यह वास्तव में अनावश्यक काम है, है ना? बेशक – MiloRambaldi

+1

। वास्तविक फिक्स की प्रतीक्षा करते समय यह केवल एक कार्य के रूप में सुझाव दिया जाता है। या आप समर्थन पुस्तकालय के पिछले संस्करण पर वापस जा सकते हैं। –

+0

अच्छा सुझाव ... मजाकिया बात यह है कि मैं इस काम के आसपास कोशिश कर रहा हूं लेकिन यह काम नहीं करेगा ... 'fragMngr.beginTransaction() को हटाने के बाद। (पुरानाफ्रैग) .commitNow();' खंड अभी भी है वहां, 'fragMngr.findFragmentByTag (fragTag) के साथ जांच कर रहा है,' यह शून्य वापस नहीं आएगा। यहां तक ​​कि अगर मैं थोड़ी देर लूप करता हूं, तो यह एक अनंत लूप बना देगा। कोई विचार क्यों? –

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