我在一个片段中有一个TextView。使用LiveData,我可以更改片段中的文本。通过使用MainActivity(片段外)中的按钮,我试图更改TextView中的文本,但它不起作用。有人能帮助我吗?下面是我的代码:
这是具有按钮和片段的MainActivity
class MainActivity : AppCompatActivity() {
var tg: ToneGenerator? = null
private lateinit var btn: Button
private lateinit var viewModel:ViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tg = ToneGenerator(AudioManager.STREAM_SYSTEM, 100)
btn = findViewById(R.id.buttonTest1)
viewModel = ViewModelProvider(this).get(ViewModel::class.java)
btn.setOnClickListener {
tg?.startTone(ToneGenerator.TONE_PROP_BEEP)
viewModel.changeMLD()
}
}
}
这是具有TextView的片段
class Fragment : Fragment() {
private lateinit var txt1: TextView
public lateinit var viewModel:ViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view: View = inflater.inflate(R.layout.fragment, container, false)
txt1 = view.findViewById(R.id.txt1)
viewModel = ViewModelProvider(this).get(ViewModel::class.java)
viewModel.initiateMLD()
viewModel.LD.observe(viewLifecycleOwner, Observer {
txt1.setText("Count is "+it)
})
return view
}
}
这是包含LiveData的ViewModel
class ViewModel : ViewModel(){
private var clickCount:Int = 0
private var MLD = MutableLiveData<Int>()
var LD : LiveData<Int> = getMLD() // observer watches this variable
fun initiateMLD(){
MLD.value = 5
clickCount = 5
}
fun getMLD():MutableLiveData<Int>{
return MLD
}
fun changeMLD(){
clickCount+=2
MLD.value = clickCount
}
}
2条答案
按热度按时间j1dl9f461#
在
fragment
中,您已经使用fragment
作为owner
创建了viewModel
,然而,要与
activity
通信,您需要使用activity
作为owner
创建viewModel
对象,这些对象称为sharedViewModels
。您可以在codelab教程中阅读更多关于
SharedViewModel
的信息。d8tt03nd2#
您正在使用
ViewModel
的两个不同示例。ViewModelProvider
为您的Activity和片段创建一个示例。这是因为它们都是viewModelStoreOwners。如果您希望在片段和Activity中使用ViewModel的同一个示例。它必须是Activity范围内的。您可以这样做