【问题标题】:Android BottomNavigation is not highlighting properly with Navigation ControllerAndroid BottomNavigation 未使用导航控制器正确突出显示
【发布时间】:2018-08-19 06:36:32
【问题描述】:

我正在尝试从 Android 架构组件实现 Nagivation。我能够成功地浏览我的片段。我正在尝试将它附加到我的底部导航,但我无法正确使用它。我可以使用Navigation.findNavController(View).navigate(R.id.Fragment) 在片段之间成功导航,但是当我使用任何 UI 组件或后退按钮执行此操作时,底部导航的突出显示不会改变,如下面的 gif 所示

MainActivity.kt我的代码如下,

class MainActivity : AppCompatActivity() {


    private lateinit var navController: NavController


    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                navController.navigate(R.id.homeFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_dashboard -> {
                navController.navigate(R.id.addEmotionFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        navController = Navigation.findNavController(this, R.id.nav_host)
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    }


}

为HomeFragment.kt

class HomeFragment : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false)
    }

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

        button.setOnClickListener {
            Navigation.findNavController(it).navigate(R.id.addEmotionFragment)
        }
    }
}

【问题讨论】:

    标签: android android-architecture-components bottomnavigationview android-jetpack android-architecture-navigation


    【解决方案1】:

    尝试使用navigation-ui。

    implementation 'androidx.navigation:navigation-ui:' + navigationVersion //currently 1.0.0-alpha05
    

    活动中

        navController = Navigation.findNavController(this, R.id.nav_host)
        NavigationUI.setupWithNavController(bottomNavigation, navController)
    

    并确保您的片段 ID 与菜单 ID 匹配。

    <item
            android:id="@+id/homeFragment"
            android:title="Home"/>
    

    【讨论】:

    • 我只是想在这个答案中再添加一个信息,即您需要在 R.menu.navigation 和 R.navigation.my_navigation_file 中拥有相同的片段 ID,以便 Navigation-UI 正常工作!我花了 3-4 个小时在众多博客上搜索,终于明白了这一点:)
    • @user345280 这很好用,但是按下返回到第一个片段(不是之前显示的片段)有什么解决办法吗?
    【解决方案2】:

    你需要在你的按钮点击手动设置一个选中的属性:

        button.setOnClickListener {
            Navigation.findNavController(it).navigate(R.id.addEmotionFragment)
            .... (Over Here)
        }
    

    Java 代码是:

    MenuItem menuItem = YourBottomViewObject.getMenu().getItem(1); menuItemsetChecked(true); MenuItem menuItem = YourBottomViewObject.getMenu().getItem(0); menuItemsetChecked(false);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2021-03-15
      相关资源
      最近更新 更多