我不明白为什么当应该显示用户名(来自用户对象)时应用程序显示为空。 当我在 MainActivity 中通过 toasts 显示时,所有内容都显示正确。
片段:
HomeFragment 类:Fragment() {
companion object{
fun getNewInstance(user: User) : HomeFragment {
val homeFragment = HomeFragment()
homeFragment.arguments?.putSerializable("user", user)
return homeFragment
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentHomeBinding.inflate(inflater, container, false)
val user = arguments?.getSerializable("user") as? User
binding.textHome.text = user?.name.toString()
return binding.root
}
}
和主要活动:
MainActivity 类:AppCompatActivity() {
@SuppressLint("SuspiciousIndentation")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val db = DataBaseController(this, null)
val databaseExists = db.doesDatabaseExist(this, "users")
if (!databaseExists) {
val registration = Intent(this, LoginActivity::class.java)
startActivity(registration)
}
setContentView(R.layout.activity_main)
var userName = SharedPreferencesHelper(this).getUserName()
var user = db.getUserByName(userName)
Toast.makeText(this, "${user!!.name} ${user!!.level} hello!", Toast.LENGTH_SHORT).show()
Toast.makeText(this, user.name.toString(), Toast.LENGTH_SHORT).show()
val homeFragment = HomeFragment.getNewInstance(user)
val dashboardFragment: Fragment = DashboardFragment()
val notificationsFragment: Fragment = NotificationsFragment()
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = NavHostFragment.findNavController(supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main)!!)
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home,
R.id.navigation_dashboard,
R.id.navigation_notifications
)
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
}
我试图通过捆绑传递参数,但情况并没有好转,我无法弄清楚
val homeFragment = HomeFragment.getNewInstance(user)
在这里,您创建
HomeFragment
的实例并将 User
传递给它。但是,您随后对该对象绝对不会执行任何操作。它未使用。没有对该变量的引用。
因此,如果您在屏幕上看到
HomeFragment
实例,那么它来自其他地方,并且它无法访问 User
。
最有可能的是,
HomeFragment
应该有自己的视图模型,并且该视图模型应该从数据库中检索User
(最好在后台线程上,例如通过使用协程)。