我是个初学者。对不起,如果太容易或我愚蠢。我想用材料设计3 kotlin制作底部导航菜单。但是这个错误来了。我想更改滚动视图的可见性。问题出在哪里?
再次,我使用这个:m3.material.io
NavigationBarView.OnItemSelectedListener { item ->
when(item.itemId) {
R.id.main -> {
likes.visibility = View.GONE
mainmenu.visibility = View.VISIBLE
}
R.id.starred -> {
mainmenu.visibility = View.GONE
likes.visibility = View.VISIBLE
}
else -> false
}
}
离开内存,但我认为您错过了单词set
,就像在setOnItemSelectedListener
中一样,侦听器需要在所有情况下返回布尔值。你只为另一种情况退还了它。你不太可能需要担心返回false(对于失败行为(,所以我只会在when语句之后返回treu。
NavigationBarView.setOnItemSelectedListener { item ->
when(item.itemId) {
R.id.main -> {
likes.visibility = View.GONE
mainmenu.visibility = View.VISIBLE
}
R.id.starred -> {
mainmenu.visibility = View.GONE
likes.visibility = View.VISIBLE
}
else -> { }
}
true
}
如果你可能要添加更多的选项卡,我建议你这样做,这样就更容易维护所有可能的情况,而不必重复类似的代码行。按照你现在的做法,你必须为每个视图的每个选项卡写一行代码,并确保你对每个案例都有正确的可见性。可以使用isVisible
扩展属性来隐藏/显示具有布尔逻辑的视图。
NavigationBarView.setOnItemSelectedListener { item ->
mainmenu.isVisible = item == R.id.main
likes.isVisible = item == R.id.starred
true
}
我认为应该是setNavigationItemSelectedListener
而不是onItemSelected
。我对顶部导航栏的材料也有同样的问题,所以,也许也试试这个。此外,请尝试添加日志语句,并验证click语句是否正常工作。这是一个供参考的示例代码-
binding.navigationViewMainScreen.setNavigationItemSelectedListener {
Log.d(TAG, "navigationViewMainScreen working")
when (it.itemId) {
R.id.log_in -> {
loginPrompt()
true
}
R.id.log_out -> {
Toast.makeText(requireContext(), "Logged Out", Toast.LENGTH_SHORT)
.show()
CoroutineScope(Dispatchers.IO).launch {
accountDataStore.logOut(requireContext())
}
true
}
R.id.sign_up -> {
findNavController()
.navigate(
MainScreenFragmentDirections.actionMainScreenFragmentToSignUpFragment()
)
true
}
R.id.remove_account -> {
Toast.makeText(requireContext(), "Account Removed", Toast.LENGTH_SHORT)
.show()
CoroutineScope(Dispatchers.IO).launch {
accountDataStore.resetAccounts(requireContext())
}
true
}
R.id.switch_account -> {
switchAccountPrompt()
true
}
R.id.contract_interface -> {
if (userLoggedIn) {
findNavController()
.navigate(
MainScreenFragmentDirections
.actionMainScreenFragmentToContractScreenFragment()
)
} else {
Toast.makeText(
requireContext(), "Log In Necessary To Continue", Toast.LENGTH_SHORT
).show()
loginPrompt()
}
true
}
R.id.about -> {
findNavController()
.navigate(
MainScreenFragmentDirections
.actionMainScreenFragmentToAboutFragment()
)
Log.d(TAG, "about working")
true
}
R.id.exit -> {
Log.d(TAG, "exit working")
logOutAndExit()
true
}
else -> {
throw IllegalArgumentException("side menu item not registered.")
}
}
}
只关注里面的内容。像这个-
R.id.log_in -> {
loginPrompt()
true
}
在这里,我们可以看到执行了一个操作,并返回true来验证这一点。只是不要忘记结尾的true
。用于验证在单击按钮后是否执行了操作。希望能有所帮助。