Show/Hide 使用数据绑定的 ViewModel 中的 ProgessBar - MVVM
Show/Hide ProgessBar from ViewModel using Databinding - MVVM
在从 Web 服务获得响应时,我想 Show/Hide 使用 ViewModel 和数据绑定的进度条。目前,我在直接从我的布局 XML 绑定的 ViewModel 中有一个函数 loginOnClicked。
我想创建一个进度条并在函数 loginOnClicked 中实现它并根据它更新可见性。有人可以帮我吗?
登录活动
class loginActivity : AppCompatActivity(),SignupResultCallBack {
override fun onSucces(message: String) {
Toast.makeText(this,message, Toast.LENGTH_SHORT)
.show()
}
override fun onError(message: String) {
Toast.makeText(this,message, Toast.LENGTH_SHORT)
.show()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_login)
val activityLoginBinding=DataBindingUtil.setContentView<ActivityLoginBinding(this,R.layout.activity_login)
activityLoginBinding.viewModel=of(this,LoginViewModelFactory(this)).get(LoginViewModel::class.java)
link_signup.setOnClickListener() {
var intent=Intent(this@loginActivity,signupActivity::class.java)
startActivity(intent)
finish()
}
var test=activityLoginBinding.viewModel!!.progBar()
if(test)
progressBar?.visibility=View.VISIBLE
else
progressBar?.visibility=View.GONE
}
}
ViewModel
class LoginViewModel(private var listener: SignupResultCallBack): ViewModel() {
private val loginUser:UserRequest
init {
this.loginUser= UserRequest("","")
}
fun loginOnCLicked(v:View){
var editLogin: Int = loginUser.isDataValid()
if (editLogin == 0)
listener.onError("entrer votre email")
else
if (editLogin == 1)
listener.onError("email invalide")
else
if (editLogin == 2)
listener.onError("mot de passe invalide")
else
if (editLogin == 3)
listener.onError("entrer votre mot de passe")
else
if (editLogin == 4)
listener.onError("champs vides")
else
{
RetrofitClient.instance.loginUser(UserRequest(loginUser.getEmail(), loginUser.getPassword())).enqueue(object : Callback<DefaultResponse> {
override fun onFailure(call: Call<DefaultResponse>, t: Throwable) {
listener.onError("t.message")
}
override fun onResponse(call: Call<DefaultResponse>, response: Response<DefaultResponse>) {
if (response.code() == 400)
listener.onSucces("login or password invalid")
else if (response.code() == 200)
listener.onSucces("success login")
}
})
}
}
}
login.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>
<variable
name="viewModel"
type="com.example.rahma.alerteaccidentapp.vm.login.LoginViewModel"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackground"
tools:context=".ui.login.loginActivity">
<Button
android:id="@+id/btn_connexion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:background="@drawable/btn_round"
android:text="Connexion"
android:onClick="@{viewModel::loginOnCLicked}"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_below="@id/password_Edit"
android:textAppearance="@style/MySerifBoldbtn"
android:textColor="@android:color/background_light"
/>
</RelativeLayout>
</layout>
首先回答您的确切问题,为 Web 服务加载添加进度条。
在您的 LoginViewModel 中创建一个 MutableLiveData 对象
public MutableLiveData<Integer> progress = new MutableLiveData<>();
在您的 loginOnCLicked 方法中
fun loginOnCLicked(v:View){
progress.setValue(0); //View.VISIBLE
.
.
.
progress.setValue(8); //View.GONE
}
使用数据绑定向您的布局添加进度条
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:visibility="@{viewModel.progress}" />
希望这对您有所帮助。
附带说明一下,我会要求您将 webservice success/Error 案例的侦听器实现更改为 LiveData。这是 MVVM 的处理方式,无需在 ViewModel 中保留 Activity 的引用。
在从 Web 服务获得响应时,我想 Show/Hide 使用 ViewModel 和数据绑定的进度条。目前,我在直接从我的布局 XML 绑定的 ViewModel 中有一个函数 loginOnClicked。
我想创建一个进度条并在函数 loginOnClicked 中实现它并根据它更新可见性。有人可以帮我吗?
登录活动
class loginActivity : AppCompatActivity(),SignupResultCallBack {
override fun onSucces(message: String) {
Toast.makeText(this,message, Toast.LENGTH_SHORT)
.show()
}
override fun onError(message: String) {
Toast.makeText(this,message, Toast.LENGTH_SHORT)
.show()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_login)
val activityLoginBinding=DataBindingUtil.setContentView<ActivityLoginBinding(this,R.layout.activity_login)
activityLoginBinding.viewModel=of(this,LoginViewModelFactory(this)).get(LoginViewModel::class.java)
link_signup.setOnClickListener() {
var intent=Intent(this@loginActivity,signupActivity::class.java)
startActivity(intent)
finish()
}
var test=activityLoginBinding.viewModel!!.progBar()
if(test)
progressBar?.visibility=View.VISIBLE
else
progressBar?.visibility=View.GONE
}
}
ViewModel
class LoginViewModel(private var listener: SignupResultCallBack): ViewModel() {
private val loginUser:UserRequest
init {
this.loginUser= UserRequest("","")
}
fun loginOnCLicked(v:View){
var editLogin: Int = loginUser.isDataValid()
if (editLogin == 0)
listener.onError("entrer votre email")
else
if (editLogin == 1)
listener.onError("email invalide")
else
if (editLogin == 2)
listener.onError("mot de passe invalide")
else
if (editLogin == 3)
listener.onError("entrer votre mot de passe")
else
if (editLogin == 4)
listener.onError("champs vides")
else
{
RetrofitClient.instance.loginUser(UserRequest(loginUser.getEmail(), loginUser.getPassword())).enqueue(object : Callback<DefaultResponse> {
override fun onFailure(call: Call<DefaultResponse>, t: Throwable) {
listener.onError("t.message")
}
override fun onResponse(call: Call<DefaultResponse>, response: Response<DefaultResponse>) {
if (response.code() == 400)
listener.onSucces("login or password invalid")
else if (response.code() == 200)
listener.onSucces("success login")
}
})
}
}
}
login.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>
<variable
name="viewModel"
type="com.example.rahma.alerteaccidentapp.vm.login.LoginViewModel"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBackground"
tools:context=".ui.login.loginActivity">
<Button
android:id="@+id/btn_connexion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:background="@drawable/btn_round"
android:text="Connexion"
android:onClick="@{viewModel::loginOnCLicked}"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_below="@id/password_Edit"
android:textAppearance="@style/MySerifBoldbtn"
android:textColor="@android:color/background_light"
/>
</RelativeLayout>
</layout>
首先回答您的确切问题,为 Web 服务加载添加进度条。
在您的 LoginViewModel 中创建一个 MutableLiveData 对象
public MutableLiveData<Integer> progress = new MutableLiveData<>();
在您的 loginOnCLicked 方法中
fun loginOnCLicked(v:View){
progress.setValue(0); //View.VISIBLE
.
.
.
progress.setValue(8); //View.GONE
}
使用数据绑定向您的布局添加进度条
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:visibility="@{viewModel.progress}" />
希望这对您有所帮助。
附带说明一下,我会要求您将 webservice success/Error 案例的侦听器实现更改为 LiveData。这是 MVVM 的处理方式,无需在 ViewModel 中保留 Activity 的引用。