Android 使用某些函数时,数据绑定不适用于textView
首先,我在布局文件中声明了变量Android 使用某些函数时,数据绑定不适用于textView,android,kotlin,user-interface,data-binding,Android,Kotlin,User Interface,Data Binding,首先,我在布局文件中声明了变量 <data> <variable name="signUpViewModel" type="ac.connect.ui.signup.SignUpViewModel" /> </data> 视图模型 class SignUpViewModel(private val setProfileUseCase: SetProfileUse
<data>
<variable
name="signUpViewModel"
type="ac.connect.ui.signup.SignUpViewModel" />
</data>
视图模型
class SignUpViewModel(private val setProfileUseCase: SetProfileUseCase) :
ViewModel() {
private val _profile = MutableLiveData<ProfileModel>()
val profile: LiveData<ProfileModel>
get() = _profile
private val _name = MutableLiveData<String>()
val name: LiveData<String>
get() = _name
fun setName(name: Editable) {
_name.value = name.toString()
}
fun setProfileData() {
viewModelScope.launch {
val profile = ProfileModel(
name = "kamal nayan",
branch = "CSE",
gender = "Male",
mobileNumber = "+91-73555555517",
rollNo = "GCS/345353",
uid = "ghafagaraggGGG"
)
val response = setProfileUseCase.invoke(profile)
_profile.value = profile
response.successOrError(::handleProductDetailsSuccess, ::handleSignUpFailure)
}
}
private fun handleProductDetailsSuccess(response: Boolean) {
_name.value = "User Data Uploaded Successfully"
}
private fun handleSignUpFailure(failure: Failure, error: ErrorResponse?) {
Timber.log(Log.ERROR, error?.message)
}
}
class SignUpViewModel(私有val setProfileUseCase:setProfileUseCase):
ViewModel(){
private val_profile=MutableLiveData()
val配置文件:LiveData
获取()=\u配置文件
private val_name=MutableLiveData()
val名称:LiveData
get()=\u名称
乐趣集名称(名称:可编辑){
_name.value=name.toString()
}
fun setProfileData(){
viewModelScope.launch{
val profile=ProfileModel(
name=“kamal nayan”,
branch=“CSE”,
性别=“男性”,
mobileNumber=“+91-7355517”,
rollNo=“GCS/345353”,
uid=“Ghafagaragggg”
)
val response=setProfileUseCase.invoke(配置文件)
_profile.value=profile
response.successOrError(::handleProductDetailsSuccess,::handleSignUpFailure)
}
}
private fun HandleProductDetailsAccess(响应:布尔值){
_name.value=“用户数据上传成功”
}
private fun handleSignUpFailure(失败:失败,错误:ErrorResponse?){
Timber.log(log.ERROR,ERROR?.message)
}
}
片段代码:
class SignUpFragment : Fragment(R.layout.fragment_sign_up) {
private val viewModel: SignUpViewModel by viewModel()
private var binding by autoCleared<FragmentSignUpBinding>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentSignUpBinding.bind(view)
binding.signUpViewModel = viewModel
binding.lifecycleOwner = this
binding.signUp.setOnClickListener {
viewModel.setProfileData()
}
}
companion object {
fun newInstance(): SignUpFragment {
return SignUpFragment()
}
}
}
classsignupfragment:Fragment(R.layout.Fragment\u sign\u){
private val viewModel:SignUpViewModel by viewModel()
自动清除()的私有变量绑定
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
binding=FragmentSignUpBinding.bind(视图)
binding.signUpViewModel=viewModel
binding.lifecycleOwner=此
binding.signUp.setOnClickListener{
viewModel.setProfileData()
}
}
伴星{
fun newInstance():SignUpFragment{
返回SignUpFragment()
}
}
}
输出为空,就像textView中没有文本一样
请帮助我,提前谢谢。我认为问题在于设置
数据绑定时没有设置变量stringExtensions
的值
import ac.connect.utils.StringExtensions
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentSignUpBinding.bind(view)
binding.signUpViewModel = viewModel
// binding.stringExtensions = StringExtensions() // If it is a class
// binding.stringExtensions = StringExtensions // If it is an object
binding.lifecycleOwner = this
binding.signUp.setOnClickListener {
viewModel.setProfileData()
}
}
如果我理解正确,您需要制作BindingAdapter
。所以你需要重写你的“大写字母”函数,如下所示
@BindingAdapter("app:capitalizeFirstLetter")
@JvmStatic fun capitalizeFirstLetter(textView: TextView, value: String){
var ans = ""
val words = value.split(" ")
words.forEach {
ans += it.capitalize() + " "
}
textView.setText(ans)
}
另外,我没有看到在哪里调用setName
函数。您确定\u name.value
不是空的吗?发布您的视图模型和片段/Activity@OhhhThatVarun都贴了。StringExtensions
是一个类还是一个对象?它是一个函数,最近我更新了这个问题,现在我们不需要做变量。。。。制作了一个绑定适配器。。。。但是如何从布局中观察实时数据检查我的新答案。这是一个实时数据,因此如何在布局中观察这一点。。。。。。。。比如,如果它是空的,那么我们需要设置一些东西,如果它被加载,我们将设置它的值。你是否像我在回答中所说的那样为你的TextView制作BindingAdapter?请注意:您可以在setValue
函数中设置断点。所以你可以看到这是一个电话。您还可以在capitalizeFirstLetter
函数中设置断点,以查看传输到此处的值。
import ac.connect.utils.StringExtensions
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentSignUpBinding.bind(view)
binding.signUpViewModel = viewModel
// binding.stringExtensions = StringExtensions() // If it is a class
// binding.stringExtensions = StringExtensions // If it is an object
binding.lifecycleOwner = this
binding.signUp.setOnClickListener {
viewModel.setProfileData()
}
}
@BindingAdapter("app:capitalizeFirstLetter")
@JvmStatic fun capitalizeFirstLetter(textView: TextView, value: String){
var ans = ""
val words = value.split(" ")
words.forEach {
ans += it.capitalize() + " "
}
textView.setText(ans)
}