Android 从片段到viewModel的数据绑定未更改
我将视图模型中的用户字段绑定到视图,但没有发现问题 当我调试时,用户正在返回正确的数据并将其保存在变量中,如fun setUser()中所述,但更改没有绑定到视图。只有在init()中更改其中一个,它才会在视图中更改!!!!我错过了什么 以下是viewModel:Android 从片段到viewModel的数据绑定未更改,android,kotlin,mvvm,data-binding,dagger-hilt,Android,Kotlin,Mvvm,Data Binding,Dagger Hilt,我将视图模型中的用户字段绑定到视图,但没有发现问题 当我调试时,用户正在返回正确的数据并将其保存在变量中,如fun setUser()中所述,但更改没有绑定到视图。只有在init()中更改其中一个,它才会在视图中更改!!!!我错过了什么 以下是viewModel: class ProfileViewModel @ViewModelInject constructor(private val appRepository: AppRepository,
class ProfileViewModel @ViewModelInject constructor(private val appRepository: AppRepository,
@Assisted private val savedStateHandle: SavedStateHandle
) :
ViewModel() ,LifecycleObserver {
var usertmp:User=User()
var name: String = "hi"
var mobile: String = ""
var mobile2: String = ""
var password: String = ""
var address: String = ""
var balanceBegory:String =""
var balanceEqlomat:String =""
var studentLevel: String? = ""
//var mTitleTV = savedStateHandle.getLiveData<String>("settingType").value
var selectedData:String=""
//clickable of button
private val _isBtnAvailable = MutableLiveData<Boolean>()
val isBtnAvailable: LiveData<Boolean>
get() = _isBtnAvailable
//to open main
private val _isopenLogin = MutableLiveData<Boolean>()
val isopenLogin: LiveData<Boolean>
get() = _isopenLogin
//progressbar
private val _dataLoading = MutableLiveData<Boolean>()
val dataLoading: LiveData<Boolean>
get() = _dataLoading
private val _ishideKeyboard = MutableLiveData<Boolean>()
val ishideKeyboard: LiveData<Boolean>
get() = _ishideKeyboard
private val msnackbarText = MutableLiveData<Event<Int>>()
val snackbarMessage: LiveData<Event<Int>>
get() = msnackbarText
private val msnackbarText2 = MutableLiveData<String>()
val snackbarMessage2: LiveData<String>
get() = msnackbarText2
init {
_ishideKeyboard.value = false
_isBtnAvailable.value = true
getUser()
// address="test"
}
private fun getUser() {
appRepository.getUserLastUpdate(object:IRemoteDataSource.LoginCallback{
override fun onResponse(user: User) {
name="yes"
setuser(user)
}
override fun onDataNotAvailable(message: Int?) {
name="No"
}
})
}
类ProfileViewModel@ViewModelInject构造函数(私有val appRepository:appRepository,
@辅助私有val savedStateHandle:savedStateHandle
) :
ViewModel(),LifecycleObserver{
var usertmp:User=User()
变量名称:String=“hi”
var mobile:String=“”
var mobile2:String=“”
var密码:String=“”
变量地址:String=“”
var balanceBegory:String=“”
var balanceEqlomat:String=“”
变量studentLevel:字符串?=“”
//var mTitleTV=savedstateholder.getLiveData(“settingType”).value
var selectedData:String=“”
//可点击的按钮
private val_isbtnavaailable=MutableLiveData()
val isBtnAvailable:LiveData
get()=\u isbtnavable
//打开主管道
private val_isopenLogin=MutableLiveData()
val isopenLogin:LiveData
get()=\u isopenLogin
//进度条
private val_dataload=MutableLiveData()
val数据加载:LiveData
get()=\u数据加载
private val_ishideKeyboard=MutableLiveData()
val ishideKeyboard:LiveData
get()=\u键盘
private val msnackbarText=MutableLiveData()
val snackbarMessage:LiveData
get()=msnackbarText
private val msnackbarText2=MutableLiveData()
val snackbarMessage2:LiveData
get()=msnackbarText2
初始化{
_ishideKeyboard.value=false
_isbtnavaailable.value=true
getUser()
//地址=“测试”
}
私人娱乐用户(){
appRepository.getUserLastUpdate(对象:IRemoteDataSource.LoginCallback{
覆盖响应(用户:用户){
name=“是”
设置用户(用户)
}
覆盖数据不可用(消息:Int?){
name=“否”
}
})
}
为了碎片
@AndroidEntryPoint
class ProfileFragment : Fragment(R.layout.fragment_profile),ProfileNavigator {
private lateinit var binding:FragmentProfileBinding
private val mLevelsList: ArrayList<Level> = ArrayList<Level>()
private val profileViewModel: ProfileViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
Log.d(ContentValues.TAG, "showMessage: create profile")
binding = FragmentProfileBinding.inflate(inflater, container, false)
val view = binding.root
binding.profileViewModel=profileViewModel
binding.lifecycleOwner = this
subscribeToNavigationChanges(profileViewModel)
return view
}
```
for profile fragment XML:
@雄蕊识别点
类ProfileFragment:Fragment(R.layout.Fragment\u profile),ProfileNavigator{
私有lateinit变量绑定:FragmentProfileBinding
private val mLevelsList:ArrayList=ArrayList()
private val profileViewModel:profileViewModel by viewModels()
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看{
Log.d(ContentValues.TAG,“showMessage:createprofile”)
绑定=碎片绑定。充气(充气机、容器、假)
val view=binding.root
binding.profileViewModel=profileViewModel
binding.lifecycleOwner=此
subscribeToNavigationChanges(profileViewModel)
返回视图
}
```
对于配置文件片段XML:
```
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="profileViewModel"
type="com.attendance.myproject.begory.presentationLayer.main.profile.ProfileViewModel"
/>
</data>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="@color/primaryLightColor"
android:padding="20dp">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/profile_image"
android:layout_width="100dp"
android:layout_height="100dp"
android:scaleType="centerCrop"
android:src="@drawable/p1"
app:civ_border_color="#591EC1"
android:layout_centerVertical="true"
app:civ_border_width="5dp" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf ="@id/profile_image"
android:layout_marginStart="10dp"
android:text="@{profileViewModel.name}"
android:textSize="20sp"
android:textStyle="bold"
android:textColor="@color/white"
/>
<TextView
android:id="@+id/tv_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{profileViewModel.studentLevel}"
android:textSize="14sp"
android:layout_toEndOf="@id/profile_image"
android:layout_marginStart="10dp"
android:layout_below="@id/tv_name"
android:textColor="@color/white"
/>
<ImageView
android:layout_width="54dp"
android:layout_height="43dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="20dp"
android:src="@drawable/logout"
android:onClick="@{()-> profileViewModel.logout()}"
android:tint="@color/secondaryLightColor"/>
</RelativeLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical"
android:padding="20dp">
<com.google.android.material.textfield.TextInputLayout
android:hint="Name"
android:id="@+id/ti_Name"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<com.google.android.material.textfield.TextInputEditText
android:drawablePadding="10dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@={profileViewModel.name}"
/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:hint="Password"
android:id="@+id/ti_password"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<com.google.android.material.textfield.TextInputEditText
android:drawablePadding="10dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@={profileViewModel.password}"
/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:hint="Address"
android:id="@+id/ti_address"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<com.google.android.material.textfield.TextInputEditText
android:drawablePadding="10dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@={profileViewModel.address}"
/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:hint="Parent Mobile"
app:hintTextColor="@color/progress_center"
android:id="@+id/ti_mobile2"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<com.google.android.material.textfield.TextInputEditText
android:drawablePadding="10dp"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@={profileViewModel.mobile2}"
/>
</com.google.android.material.textfield.TextInputLayout>
```