如何正确将MainActivity对象传递给fragment?

问题描述 投票:0回答:1

我不明白为什么当应该显示用户名(来自用户对象)时应用程序显示为空。 当我在 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)
}

}

我试图通过捆绑传递参数,但情况并没有好转,我无法弄清楚

android kotlin android-fragments
1个回答
0
投票
val homeFragment = HomeFragment.getNewInstance(user)

在这里,您创建

HomeFragment
的实例并将
User
传递给它。但是,您随后对该对象绝对不会执行任何操作。它未使用。没有对该变量的引用。

因此,如果您在屏幕上看到

HomeFragment
实例,那么它来自其他地方,并且它无法访问
User

最有可能的是,

HomeFragment
应该有自己的视图模型,并且该视图模型应该从数据库中检索
User
(最好在后台线程上,例如通过使用协程)。

© www.soinside.com 2019 - 2024. All rights reserved.