FragmentContainerView as NavHostFragment

后端 未结 5 1753
别跟我提以往
别跟我提以往 2020-12-30 18:30

Seems like using the FragmentContainerView doesn\'t work right out of the box?



        
相关标签:
5条回答
  • 2020-12-30 19:07

    using android:name instead of class. works.

    <androidx.fragment.app.FragmentContainerView
        android:name="androidx.navigation.fragment.NavHostFragment"
        ...
    
    0 讨论(0)
  • 2020-12-30 19:10

    Due to this bug-report: https://issuetracker.google.com/issues/142847973

    The only way (currently) is to to this:

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

    (Java):

    NavHostFragment navHostFragment =
        (NavHostFragment) getSupportFragmentManager()
            .findFragmentById(R.id.my_nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    
    0 讨论(0)
  • 2020-12-30 19:12

    What I did was to wait for the NavHostFragment to inflate its view:

    Kotlin:

    super.onCreate(savedInstanceState)
    
    // Set up the form and list.
    setContentView(R.layout.activity_xxx)
    
    // Set up navigation - action bar and sidebar.
    /// Let the navigation view check/uncheck the menu items.
    nav_view.post { // wait for NavHostFragment to inflate
        val navController = findNavController()
        nav_view.setupWithNavController(navController)
        nav_view.setNavigationItemSelectedListener(this)
    }
    

    Java8 (with lambda):

    navigationView.post(() -> { // wait for NavHostFragment to inflate
        navController = Navigation.findNavController(activity, R.id.nav_host_fragment);
        NavigationUI.setupWithNavController(navView, navController);
        navView.setNavigationItemSelectedListener(navItemSelectedListener);
    });
    
    0 讨论(0)
  • 2020-12-30 19:18

    Call findNavController in postOnCreate instead of onCreate.

    Source: https://issuetracker.google.com/issues/142847973

    0 讨论(0)
  • 2020-12-30 19:19

    August 2020 update

    Here is the solution recommended by the official Android documentation.

    Kotlin version:

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

    Java version:

    NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    

    I quote the doc:

    When creating the NavHostFragment using FragmentContainerView or if manually adding the NavHostFragment to your activity via a FragmentTransaction, attempting to retrieve the NavController in onCreate() of an Activity via Navigation.findNavController(Activity, @IdRes int) will fail. You should retrieve the NavController directly from the NavHostFragment instead.


    The bug-report reported by Ove Stoerholt will not be fixed. You can see here the "Won't Fix (Infeasible)" status.

    0 讨论(0)
提交回复
热议问题