<Androidx.fragment.app.ragmentContainerView> बनाम <टुकड़ा> एक NavHost के लिए एक दृश्य के रूप में


11

जब androidx.fragment.app.FragmentContainerViewएक नियमित fragmentऐप के बजाय नेवीहोस्ट के रूप में उपयोग किया जाता है, तो अभिविन्यास परिवर्तन के बाद गंतव्य पर नेविगेट करने में सक्षम नहीं है।

मुझे निम्नलिखित त्रुटि मिलती है: java.lang.IllegalStateException: no current navigation node

क्या कोई ऐसा गोचा है जिसके बारे में मुझे पता होना चाहिए कि इसका सही तरीके से उपयोग करना है या क्या मेरे पास नौसैनिकों के इस्तेमाल का तरीका गलत है?

एक दृश्य के साथ सरल गतिविधि xml:


...
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:navGraph="@navigation/nav_simple" />
...

नेविगेशन कोड:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_legislator.xml"
    app:startDestination="@id/initialFragment">

    <fragment
        android:id="@+id/initialFragment"
        android:name="com.example.fragmenttag.InitialFragment"
        android:label="Initial Fragment"
        tools:layout="@layout/initial_fragment">
        <action
            android:id="@+id/action_initialFragment_to_destinationFragment"
            app:destination="@id/destinationFragment" />
    </fragment>
    <fragment
        android:id="@+id/destinationFragment"
        android:name="com.example.fragmenttag.DestinationFragment"
        android:label="Destination Fragment"
        tools:layout="@layout/destination_fragment" />

</navigation>

यहाँ एक गितुब रेपो है जहाँ आप आसानी से बग को पुन: उत्पन्न कर सकते हैं: https://github.com/dmytroKarataiev/navHostBug


आपको <fragmentएक में डालने की जरूरत है FragmentContainerView
एपिकपांडाफॉर्क्स

जवाबों:


19

no current navigation nodeत्रुटि तब होती है जब कोई ग्राफ सेट है और आप कॉल करने का प्रयास navigate()। यदि यह केवल तब होता है जब आप उपयोग कर रहे हैं FragmentContainerViewऔर कॉन्फ़िगरेशन परिवर्तन के बाद, तो यह इस बग से संबंधित होगा , जो कि नेविगेशन 2.2.0-rc03 के साथ रिलीज़ के लिए निर्धारित और निर्धारित है।

इस समस्या को हल करने के लिए, आप या तो वापस स्विच कर सकते हैं <fragment>या हटा सकते हैं app:navGraph="@navigation/nav_simple"और इसके बजाय कॉल कर सकते हैं navController.setGraph(R.navigation.nav_simple)


मैंने वास्तव में इस दृष्टिकोण की कोशिश की और मुझे बिल्कुल वही त्रुटि मिली। क्या आप रेपो की जांच कर पाएंगे और इस दृष्टिकोण के साथ काम करने की कोशिश करेंगे?
दिमित्रो कराटाएव

इसके अलावा, यह दुर्घटना अभिविन्यास परिवर्तन के बाद ही होती है। यह अन्य सभी समय पर काम करता है।
Dmytro Karataiev

मुझे वास्तव में लगता है कि यह वही त्रुटि नहीं है, मेरे प्रश्न में नेवी कंट्रोलर शून्य नहीं है, लेकिन इसका बैक स्टैक खाली है और ग्राफ शून्य है।
Dmytro Karataiev

आह, हाँ, यह बहुत महत्वपूर्ण जानकारी है, जैसा आप अनुभव कर रहे हैं, यह अन्य मुद्दा है । मैंने उस मुद्दे पर चर्चा करने के लिए अपने जवाब को अपडेट कर दिया है।
atहनुनीबल्लके २२:४ib बजे

धन्यवाद, पूर्ण।
Dmytro Karataiev

0

मुझे कोई स्पष्टीकरण नहीं दिखाई देता है कि फ्रेग्मेंट व्यू को फ्रैगमेन्टकॉन्टेनर व्यू से क्यों बदलें । यही कारण है कि इस उत्तर को जोड़ें:

किसी गतिविधि में टुकड़ों को होस्ट करने के लिए सामान्य पैटर्न में से एक फ्रेमलेयआउट का उपयोग करना है। Android समुदाय वर्षों से ऐसा कर रहा है लेकिन यह अब बदलने जा रहा है। Androidx टीम ने आपके लिए ऐसा करने के लिए FragmentContainerView नामक यह नया दृश्य पेश किया।

आपको बस इतना करना है कि अपने फ्रेमलैट को FragmentContainerView से बदल दें और सबकुछ बॉक्स से हटकर हो जाए, आपको उस तरह से कुछ भी बदलने की जरूरत नहीं होगी जिस तरह से आप टुकड़ा लेनदेन को संभालते हैं।

यहाँ प्राप्त लाभों को टुकड़ों के लिए z- ऑर्डरिंग कहा जाता है की बेहतर हैंडलिंग है। यहां उनका उपयोग किया गया उदाहरण है, लेकिन मूल रूप से इसका मतलब है, उदाहरण के लिए, कि दो टुकड़ों के बीच निकास और प्रवेश संक्रमण एक दूसरे को ओवरलैप नहीं करेंगे। इसके बजाय यह FragmentContainerView पहले निकास एनीमेशन शुरू करने जा रहा है फिर प्रवेश एनीमेशन।

यदि आप पूछ रहे हैं कि यह टैग कैसे बदल सकता है? तो जवाब है हां। FragmentContainerView को परिभाषित करते समय आपको बस इतना करना होगा कि android: name = "your_class_name" जोड़ना है और यह आपके टुकड़े को बनाने और दिखाने के लिए हुड के नीचे एक FragmentTransaction का उपयोग करेगा। इसका मतलब है कि आप इसे बदलने के लिए बाद में खंड लेनदेन का उपयोग कर सकते हैं।

स्रोत

Android डॉक्स


1
मुझे विश्वास नहीं है कि यह प्रश्न लेखक द्वारा पूछे जा रहे सवालों के जवाब देता है।
एलगोरियन

1
यह अभी भी अच्छी अतिरिक्त जानकारी है।
Rvb84
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.