首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有视图绑定的导航

带有视图绑定的导航
EN

Stack Overflow用户
提问于 2020-03-18 03:50:17
回答 4查看 9.4K关注 0票数 7

我试图使用视图绑定来替换所有的findViewById。但是,我不能使用NavController视图绑定更改我的代码行。

代码语言:javascript
复制
val navController = findNavController(this, R.id.mainHostFragment)

代码语言:javascript
复制
var binding : ActivityMainBinding
val navController = findNavController(this, binding.mainHostFragment)

我怎么能这么做?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-18 05:25:25

您不能用视图绑定来替换它。findNavController不仅仅是在布局中找到视图。

查看源代码这里

代码语言:javascript
复制
/**
* Find a {@link NavController} given a local {@link Fragment}.
*
* <p>This method will locate the {@link NavController} associated with this Fragment,
* looking first for a {@link NavHostFragment} along the given Fragment's parent chain.
* If a {@link NavController} is not found, this method will look for one along this
* Fragment's {@link Fragment#getView() view hierarchy} as specified by
* {@link Navigation#findNavController(View)}.</p>
*
* @param fragment the locally scoped Fragment for navigation
* @return the locally scoped {@link NavController} for navigating from this {@link Fragment}
* @throws IllegalStateException if the given Fragment does not correspond with a
* {@link NavHost} or is not within a NavHost.
*/
@NonNull
public static NavController findNavController(@NonNull Fragment fragment) {
Fragment findFragment = fragment;
while (findFragment != null) {
    if (findFragment instanceof NavHostFragment) {
        return ((NavHostFragment) findFragment).getNavController();
    }
    Fragment primaryNavFragment = findFragment.getParentFragmentManager()
            .getPrimaryNavigationFragment();
    if (primaryNavFragment instanceof NavHostFragment) {
        return ((NavHostFragment) primaryNavFragment).getNavController();
    }
    findFragment = findFragment.getParentFragment();
}
// Try looking for one associated with the view instead, if applicable
View view = fragment.getView();
if (view != null) {
    return Navigation.findNavController(view);
}
throw new IllegalStateException("Fragment " + fragment
        + " does not have a NavController set");
}

它不仅仅是找到控制器。它遍历、创建片段、创建视图和抛出异常。

视图绑定只生成一个绑定类,其中包含布局的所有视图。它不是用来查找应用程序的导航控制器的。

票数 6
EN

Stack Overflow用户

发布于 2021-03-06 02:24:09

下面是我的示例代码,使用视图绑定和导航。

代码语言:javascript
复制
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
import com.zeddigital.zigmaster.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding : ActivityMainBinding

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

        /*
        Use view binding in activities
        
        Call the static inflate() method included in the generated binding class. 
        This creates an instance of the binding class for the activity to use.
        Get a reference to the root view by either calling the getRoot() method or using Kotlin property syntax.
        Pass the root view to setContentView() to make it the active view on the screen.*/
        binding = ActivityMainBinding.inflate(layoutInflater)

        val view = binding.root
        setContentView(view)

        setSupportActionBar(binding.appBarMain.toolbar)

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

        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        appBarConfiguration = AppBarConfiguration(setOf(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow), binding.drawerLayout)
        setupActionBarWithNavController(navController, appBarConfiguration)
        binding.navView.setupWithNavController(navController)

    }
}
票数 4
EN

Stack Overflow用户

发布于 2020-06-30 03:29:53

借助这个回答中的帮助,我发现了一个简单的实现

代码语言:javascript
复制
binding?.apply {
        setContentView(root)
        setSupportActionBar(toolbar)
        navController = (supportFragmentManager
            .findFragmentById(fragmentHost.id) as NavHostFragment)
            .navController
        setupActionBarWithNavController(navController, appBarConfiguration)
        bottom.setupWithNavController(navController)
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60733289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档