如何解决从 MainActivity 类将新字符串注入 Fragment/ViewModel
使用 android studio 底部导航活动模板,希望每次从底部导航访问主页时更改我的 HomeFragment
/ Homeviewmodel
页面文本。当我第一次点击它时,它显示的文字应该与第二次显示的文字不同。
我能够创建一个保存文本输出的变量,并且我已经创建了一个应该能够更新该变量的函数,但我无法在 MainActivity
类中调用它。有什么想法吗?
主活动
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration(setof(
R.id.navigation_home,R.id.navigation_dashboard,R.id.navigation_notifications))
navView.setupWithNavController(navController)
}
HomeFragment
class HomeFragment : Fragment() {
private lateinit var homeviewmodel: Homeviewmodel
var chosenOutput:String = "primary output";
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
//using update here crashes the app
homeviewmodel =
viewmodelProvider(this).get(Homeviewmodel::class.java)
val root = inflater.inflate(R.layout.fragment_home,container,false)
val textView: TextView = root.findViewById(R.id.text_home)
homeviewmodel.text.observe(viewLifecycleOwner,Observer {
textView.text = chosenOutput; //changing 'chosenOutput' to 'it' means that text update must take place within Homeviewmodel instead of fragment.
})
return root
}
fun update(result: String)
{
chosenOutput = result;
}
}
Homeviewmodel
class Homeviewmodel : viewmodel() {
var temp:String = "demo"
//constructor()
private val _text = mutablelivedata<String>().apply {
value = temp;
}
fun update(result: String) //function may be obsolete if text change can be done in fragment.
{
temp = result;
}
val text: LiveData<String> = _text
}
将字符串注入我给出的 Fragment
类中的 viewmodel
或 MainActivity
的正确方法是什么?
解决方法
您可以更改方法并将 chosenOutput
变量存储在 MainActivity
并在每次选择 HomeFragment
class MainActivity : AppCompatActivity()
{
var chosenOutput = "primary output"
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration(setOf(
R.id.navigation_home,R.id.navigation_dashboard,R.id.navigation_notifications))
navView.apply {
setupWithNavController(navController)
setOnNavigationItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.navigation_home -> {
chosenOutput = "new value" // <-- Update chosen output here
// Add this method to call the `onResume` method in the fragment
showFragment(HomeFragment.newInstance())
}
else { }
}
true
}
}
private fun showFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.nav_host_fragment,fragment)
.addToBackStack(null)
.commit()
}
}
然后您可以使用此代码在您的 Fragment
中检索更新后的字符串。
请注意,我添加了 companion object
以避免创建 Fragment
的多个实例。
class HomeFragment : Fragment()
{
companion object
{
fun newInstance() : HomeFragment
{
return HomeFragment()
}
}
override fun onResume() {
super.onResume()
val newChosenOutput = (activity as MainActivity).chosenOutput
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。