IllegalStateException: ลิงก์ไม่มีชุด NavController

53
Priyanshu Khandelwal 2018-05-24 20:20.

ฉันใช้ Android Navigation Component สำหรับการนำทาง ฉันมี LoginFragment ซึ่งมีปุ่มสำหรับเปลี่ยนเป็น SignUpFragment เมื่อคลิกปุ่มฉันได้รับข้อผิดพลาดนี้

java.lang.IllegalStateException: View android.support.v7.widget.AppCompatButton{49d9bd1 VFED..C.. ...P.... 201,917-782,1061 #7f090172 app:id/signUpLink} does not have a NavController set

นี่คือ nav_graph.xml ของฉัน

<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        app:startDestination="@id/loginFragment">
        <fragment
            android:id="@+id/loginFragment"
            android:name="org.fossasia.openevent.app.core.auth.login.LoginFragment"
            android:label="login_fragment"
            tools:layout="@layout/login_fragment">
            <action
                android:id="@+id/action_loginFragment_to_signUpFragment"
                app:destination="@id/signUpFragment" />

        </fragment>
    </navigation>

นี่คือรหัสใน LoginFragment สำหรับการนำทาง -

binding.signUpLink.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_loginFragment_to_signUpFragment, null));

นี่คือสารสกัดจากไฟล์เค้าโครงกิจกรรมสำหรับ NavHostFragment -

<FrameLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:name="android.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/main_navigation"
    app:defaultNavHost="true"/>

9 answers

118
Rawa 2020-03-09 23:26.

วิธีแก้ปัญหาที่แนะนำอย่างเป็นทางการ

ขณะนี้การใช้ FragmentContainerView ไม่ค่อยเป็นมิตรคุณต้องเข้าถึงจาก supportFragmentManager:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController

ใน xml ของฉัน FragmentContainerView ของฉันมีลักษณะดังนี้:

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="parent"
    app:navGraph="@navigation/nav_graph"
    />

สิ่งนี้ได้รับการทดสอบด้วยเวอร์ชันการนำทาง androidx 2.3.0

ฉันได้ลบคำตอบเก่าออกไปแล้วเนื่องจาก Google devs ชี้แจงว่าไม่ใช่วิธีแก้ปัญหาที่แนะนำอีกต่อไป ขอบคุณ @Justlearnedit สำหรับการโพสต์ความคิดเห็นที่อนุญาตให้ฉันอัปเดตปัญหานี้

51
Priyanshu Khandelwal 2018-05-26 11:40.

โซลูชันที่อัปเดต

จริงๆแล้วการนำทางไม่พบ NavController ใน FrameLayout ดังนั้นการแทนที่<FrameLayout>ด้วย<fragment>จะทำให้ได้ผล

เพิ่มสิ่งต่อไปนี้ภายใน<fragment>แท็ก -

android:name="androidx.navigation.fragment.NavHostFragment"

หลังจากทำการเปลี่ยนแปลงโค้ดจะมีลักษณะคล้ายกับสิ่งนี้ -

 <fragment
       android:id="@+id/fragment_container"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       app:layout_behavior="@string/appbar_scrolling_view_behavior"
       android:name="androidx.navigation.fragment.NavHostFragment"
       app:navGraph="@navigation/main_navigation"
       app:defaultNavHost="true"/>
14
Just learned it 2020-02-28 04:02.

ฉันได้ทำการค้นคว้าและพบปัญหานี้ใน Googleด้วย นี่คือทางออกอย่างเป็นทางการใน Java:

NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager()
                .findFragmentById(R.id.nav_host_fragment);
NavController navCo = navHostFragment.getNavController();

และที่นี่ใน kotlin:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
7
Valeriy Katkov 2020-08-07 22:16.

เหตุผลก็คือมุมมองส่วนย่อยไม่พร้อมใช้งานในActivity.onCreate()เมธอดหากคุณเพิ่มโดยใช้FragmentContainerView(หรือเพียงแค่กFrameLayout) วิธีที่เหมาะสมในการรับNavControllerในกรณีนี้คือการค้นหาNavHostFragmentและรับตัวควบคุมจากมัน ดูปัญหาและคำอธิบาย

override fun onCreate(savedInstanceState: Bundle?) {
   ...

   val navHostFragment = supportFragmentManager.findFragmentById(R.id.my_fragment_container_view_id) as NavHostFragment
   val navController = navHostFragment.navController
}

อย่าใช้ <fragment>แทน<androidx.fragment.app.FragmentContainerView>คำตอบอื่น ๆ ที่แนะนำ ดูความคิดเห็นจากทีม Google ในปัญหาที่ฉันกล่าวถึงข้างต้น

คุณควรใช้ FragmentContainerView เสมอ มีการแก้ไขอื่น ๆ อย่างแน่นอนเกี่ยวกับการแทรกหน้าต่างและปัญหาเลย์เอาต์ที่เกิดขึ้นเมื่อเค้าโครงรูทของแฟรกเมนต์อยู่ภายในเลย์เอาต์อื่น ๆ เช่น ConstraintLayout โดยตรงนอกเหนือจากปัญหาพื้นฐานของแท็กที่ส่วนที่เพิ่มผ่านแท็กนั้นจะต้องผ่านสถานะวงจรการใช้งานที่แตกต่างอย่างสิ้นเชิง เพิ่มไปยัง FragmentManager การตรวจสอบ Lint นั้นมีอยู่อย่างแน่นอนเพราะคุณควรเปลี่ยนไปใช้ FragmentContainerView ในทุกกรณี

นอกจากนี้ยังมีประกาศจาก AndroidDevSummit 2019 ซึ่งอธิบายว่าเหตุใดจึงFragmentContainerViewมีการเปิดตัวและอีกหัวข้อหนึ่งใน SO เกี่ยวกับความแตกต่าง: <androidx.fragment.app.FragmentContainerView> เทียบกับ <fragment> เป็นมุมมองสำหรับ NavHost

4
Ali hasan 2018-09-08 03:06.

ใช้มุมมองของแฟรกเมนต์เช่น onViewCreated

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val navController = Navigation.findNavController(view)

    binding.signUpLink.setOnClickListener {
            navController.navigate(R.id.action_loginFragment_to_signUpFragment)
    }
4
butchy butchy 2019-11-12 22:58.

ฉันประสบปัญหาเดียวกัน แทนที่จะเป็นแบบนี้

binding.signUpLink.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_loginFragment_to_signUpFragment, null));

ฉันใช้ของฉันNavHostFragmentเพื่อค้นหาNavHostFragment:

Button button = (Button)findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Fragment navhost = getSupportFragmentManager().findFragmentById(R.id.fragment2);
                NavController c = NavHostFragment.findNavController(navhost);
                c.navigate(R.id.firstFragment);


            }
        });

fragment2คือnavhostfragmentID.

3
AndresElCaraDeMemela 2020-05-18 18:17.

ใน Java ลองบรรทัดด้านล่างนี้:

Navigation.findNavController(findViewById(R.id.nav_host_fragment)).navigate(R.id.first_fragment);
0
u_pendra 2019-12-06 22:25.

มีสิ่งแปลก ๆ เกิดขึ้นกับฉันด้านล่างข้อมูลโค้ดกำลังทำงานบนโฟลว์ปกติจาก Fragment1 ถึง fragment2 แต่หลังจากมาที่ fragment1 และเปิดใช้งาน fragment2 อีกครั้งนี่เป็นการส่งข้อผิดพลาด "Navigation controller not set for the view"

    binding.ivIcon.setOnClickListener(v -> {
            Openfragment2(v);});

private void Openfragment2(View view) {
    Navigation.findNavController(binding.ivIcon).navigate(R.id.fragment2);

}

นี่คือปัญหาในการดูใน findNavController จำเป็นต้องส่งผ่านมุมมองที่เลือก

private void Openfragment2(View view) {
    Navigation.findNavController(view).navigate(R.id.fragment2);

}
0
Amr263 2020-03-27 01:07.

ฉันประสบปัญหานี้ในตอนนี้ แต่ฉันแน่ใจเกี่ยวกับรหัสของฉันและจากนั้นก็ตระหนักว่าฉันได้เปลี่ยนตำแหน่งของส่วนจากภายใต้แพ็คเกจหลักไปยังโฟลเดอร์อื่น

ดังนั้นฉันจึงแก้ไขปัญหาด้วย Build-> clean แล้ว Build -> make project เพื่อให้ IDE เปลี่ยนคลาส Directions

Related questions

MORE COOL STUFF

Jana Duggar: ทุกสิ่งที่เธอพูดเกี่ยวกับความรักและกรอบเวลา 5 ปีของเธอเพื่อค้นหา 'หนึ่ง'

Jana Duggar: ทุกสิ่งที่เธอพูดเกี่ยวกับความรักและกรอบเวลา 5 ปีของเธอเพื่อค้นหา 'หนึ่ง'

Jana Duggar เปิดใจเกี่ยวกับการค้นหาความรักของเธอ นี่คือทุกสิ่งที่เธอพูดเกี่ยวกับหัวข้อและกรอบเวลา 5 ปีสำหรับการแต่งงาน

แซม ฮิวแฮนรู้ดีว่าเขาจะได้อะไรจากฉาก 'Outlander' — 'ฉันรู้สึกเหมือนตัวเองเป็นเจมี่เมื่อใส่มันลงไป'

แซม ฮิวแฮนรู้ดีว่าเขาจะได้อะไรจากฉาก 'Outlander' — 'ฉันรู้สึกเหมือนตัวเองเป็นเจมี่เมื่อใส่มันลงไป'

เมื่อเร็ว ๆ นี้ แซม ​​ฮิวแฮน นักแสดงจากเรื่อง 'Outlander' ได้เปิดเผยสิ่งที่เขาจะทำจากกองถ่ายเพื่อระลึกถึงเจมี เฟรเซอร์ บทบาทที่ทำให้เขากลายเป็นดารา

เพลงของบีทเทิลยุคแรกซึ่งเป็นหนึ่งใน 'การแสดงที่น่าตื่นเต้นที่สุด' ของวง อ้างอิงจากวงในของ Fab Four

เพลงของบีทเทิลยุคแรกซึ่งเป็นหนึ่งใน 'การแสดงที่น่าตื่นเต้นที่สุด' ของวง อ้างอิงจากวงในของ Fab Four

'She Loves You' เขียนขึ้นในหนึ่งชั่วโมง บันทึกเสียงในหนึ่งวัน และเป็นเพลงของ The Beatles ที่มีการแสดงที่ดีที่สุดเพลงหนึ่งในอาชีพของพวกเขา

Dolly Parton ช่วยคุณยายที่ 'ไม่ถูกต้อง' ของเธอ เมื่อไม่มีหลานคนอื่นๆ อยากทำ—เธอก็จะแกล้งเธอด้วย

Dolly Parton ช่วยคุณยายที่ 'ไม่ถูกต้อง' ของเธอ เมื่อไม่มีหลานคนอื่นๆ อยากทำ—เธอก็จะแกล้งเธอด้วย

Dolly Parton และคุณย่า Bessie มีความสัมพันธ์พิเศษ คุณยายพาร์ตันป่วยหนัก แต่นั่นไม่ได้ทำให้ดอลลี่หยุดแกล้งเธอ

ไม้ชนิดใดที่แข็งที่สุดในโลก?

ไม้ชนิดใดที่แข็งที่สุดในโลก?

คุณอาจคิดว่าไม้โอ๊คหรือฮิคคอรีเป็นไม้ที่แข็ง แต่เมื่อต้องพูดถึงไม้ที่แข็งที่สุดในโลกแล้ว พวกมันกลับไม่ใกล้เคียงเลย

10 สิ่งมีชีวิตใต้ทะเลที่น่ากลัวที่สุดที่แฝงตัวอยู่ในส่วนลึกของมหาสมุทร

10 สิ่งมีชีวิตใต้ทะเลที่น่ากลัวที่สุดที่แฝงตัวอยู่ในส่วนลึกของมหาสมุทร

มหาสมุทรเต็มไปด้วยความงาม แต่ก็ซ่อนสิ่งมีชีวิตใต้ท้องทะเลที่น่ากลัวที่สุดบางชนิดไว้เช่นกัน สัตว์เหล่านี้หลายชนิดซ่อนตัวอยู่ใต้ผิวน้ำอันมืดมิด ในโลกใต้ทะเลลึกอันแสนกดดันและมืดมิด

10 สุดยอดการร่ายมนตร์ดาบใน Minecraft

10 สุดยอดการร่ายมนตร์ดาบใน Minecraft

หากคุณกำลังต่อสู้กับศัตรูหรือกำลังเตรียมตัวสำหรับโหมด PvP การรู้ถึงการเสริมพลังดาบที่ดีที่สุดใน Minecraft จะช่วยให้คุณได้เปรียบอย่างมาก การเสริมพลังดาบจะช่วยให้คุณสร้างความเสียหายได้มากขึ้น เพิ่มจำนวนม็อบที่ดรอป และเพิ่มความทนทานของดาบ

13 ประเทศสังคมนิยมที่ดูแตกต่างกันอย่างมาก

13 ประเทศสังคมนิยมที่ดูแตกต่างกันอย่างมาก

เมื่อผู้คนพูดถึงประเทศสังคมนิยม พวกเขามักจะนึกถึงการควบคุมโดยรัฐบาลอย่างเต็มรูปแบบโดยไม่มีกรรมสิทธิ์ส่วนบุคคล แต่ในทางปฏิบัติ เศรษฐกิจแบบสังคมนิยมมีความหลากหลายอย่างมาก

ที่ 9,800 เหรียญสหรัฐ คุณจะ 'แพ็ค 'Em In' ใน Toyota RAV4 7 ที่นั่งปี 2008 นี้หรือไม่?

ที่ 9,800 เหรียญสหรัฐ คุณจะ 'แพ็ค 'Em In' ใน Toyota RAV4 7 ที่นั่งปี 2008 นี้หรือไม่?

RAV4 นี้อ้างว่าอยู่ในสภาพที่ดีเยี่ยมและมีไว้สำหรับการเล่นเก้าอี้ดนตรี

การแสดง Black Panther ของ Marvel จะเป็นการแสดงแอนิเมชั่นที่สำคัญที่สุด

การแสดง Black Panther ของ Marvel จะเป็นการแสดงแอนิเมชั่นที่สำคัญที่สุด

Eyes of Wakanda เชื่อมโยงโดยตรงกับ MCU พร้อมอัปเดตเกี่ยวกับ X-Men '97, What If..., Daredevil และอีกมากมาย

ประวัติการออกเดทของ Ava Gardner: ย้อนมองการแต่งงานและความโรแมนติกของไอคอนแห่งฮอลลีวูด

ประวัติการออกเดทของ Ava Gardner: ย้อนมองการแต่งงานและความโรแมนติกของไอคอนแห่งฮอลลีวูด

Ava Gardner แต่งงานกับ Mickey Rooney และ Frank Sintra และเธอยังคบหาดูใจกับดาราฮอลลีวูดอีกหลายคน ต่อไปนี้คือประวัติการออกเดทของ Ava Gardner

ภรรยาของจอห์น คลีส คือใคร? ข้อมูลทั้งหมดเกี่ยวกับเจนนิเฟอร์ เวด

ภรรยาของจอห์น คลีส คือใคร? ข้อมูลทั้งหมดเกี่ยวกับเจนนิเฟอร์ เวด

จอห์น คลีส แต่งงานกับเจนนิเฟอร์ เวด ภรรยาของเขาในปี 2012 นี่คือทุกสิ่งที่คุณต้องรู้เกี่ยวกับเจนนิเฟอร์ เวด ภรรยาของจอห์น คลีส

ภรรยาของไมเคิล ซี. ฮอลล์คือใคร? ข้อมูลทั้งหมดเกี่ยวกับมอร์แกน แม็คเกรเกอร์

ภรรยาของไมเคิล ซี. ฮอลล์คือใคร? ข้อมูลทั้งหมดเกี่ยวกับมอร์แกน แม็คเกรเกอร์

Michael C. Hall แต่งงานกับ Morgan Macgregor ภรรยาของเขาตั้งแต่ปี 2016 นี่คือทุกสิ่งที่คุณต้องการทราบเกี่ยวกับภรรยาของ Michael C. Hall

สามีของ Mena Suvari คือใคร? เกี่ยวกับ ไมเคิล โฮป

สามีของ Mena Suvari คือใคร? เกี่ยวกับ ไมเคิล โฮป

Mena Suvari แต่งงานกับ Michael Hope สามีของเธอมาตั้งแต่ปี 2018 นี่คือทุกสิ่งที่ควรรู้เกี่ยวกับสามีของ Mena Suvari

สรรพนามน่ากลัวมาก

มันทำให้ฉันประหลาดใจ ทันใดนั้นมันก็เกิดขึ้นบ่อยๆ มันอยู่กลางทางอีกครั้ง <ไม่ ไม่ใช่คนในมหาสมุทรแปซิฟิก คุณเป็นสีน้ำตาลแดง คนที่งานคาร์นิวัล> ทุกพาดหัวข่าวดัง…..

3 วิธีที่พิสูจน์แล้วในการพัฒนาทักษะการเขียนของคุณ

ประโยชน์ของการเขียนและกลยุทธ์ที่จะช่วยให้คุณทำได้

3 วิธีที่พิสูจน์แล้วในการพัฒนาทักษะการเขียนของคุณ

ในปี 2022 ด้วยการเปิดตัว GPT-3 ทักษะการเขียนดูเหมือนจะมีความสำคัญน้อยลง ด้วย AI คนที่เขียนไม่ดีก็สามารถสร้างพนักงานที่มีคุณภาพได้เช่นกัน

การพังทลายอย่างช้าๆ: เปิดเผยวิธีที่ผู้คนสูญเสียไปในอาชีพของพวกเขา

การพังทลายอย่างช้าๆ: เปิดเผยวิธีที่ผู้คนสูญเสียไปในอาชีพของพวกเขา

ในโลกที่เปลี่ยนแปลงอย่างรวดเร็วและการแข่งขันในปัจจุบัน อาชีพของคนๆ หนึ่งมีบทบาทสำคัญในการเติบโตส่วนบุคคล ความมั่นคงทางการเงิน และความพึงพอใจในชีวิตโดยรวม อย่างไรก็ตาม ผู้คนจำนวนมากพบว่าตัวเองติดอยู่ในวงจรของความเมื่อยล้าและความไม่พอใจอย่างไม่หยุดยั้ง ค่อยๆ สูญเสียชีวิตการทำงานไป

อะไรทำให้พอดคาสต์มีอิทธิพล?

อะไรทำให้พอดคาสต์มีอิทธิพล?

เมื่อสัปดาห์ที่แล้วฉันสังเกตเห็นข่าวประชาสัมพันธ์ที่เผยแพร่ผ่าน PressGazette (เว็บไซต์ข่าวของสื่ออังกฤษ) บทความประกาศว่า Acast ซึ่งเป็นบริษัทโฮสติ้งและโฆษณาพอดคาสต์ของ Scandi จะเป็นผู้นำกลุ่มผู้เผยแพร่ "อาจมีอิทธิพลมากที่สุด" ในพอดคาสต์

Language