java Android MVVM如何从XML中获取元素以对其进行操作,以及在何处操作
我以前用传统的方式为安卓编程,没有任何架构, 但我正在努力学习如何在安卓中使用MVVM架构编程
他们给了我一个架构“准备就绪”的项目,但我需要一些时间才能理解
我了解LiveData和MutableLiveData在ViewModel层中的使用,以及从xml布局访问它以操作元素的目的。 但是,我如何访问这些元素来做一些事情,比如给它们一个动画
例如:空转。加载动画(getApplication(),R.anim)。顶级动画)
我应该将LoginBindingactivity从视图层(LoginActivity)发送到ViewModelLayer(LoginViewModel)吗
比如:LoginView模型。LoginImation(活动登录绑定), 然后在ViewModel中执行此操作:activityLoginBinding。背景布局。setAnimation(topAnim)
XML
<layout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
xmlns:app="http://schemas.安卓.com/apk/res-auto"
xmlns:tools="http://schemas.安卓.com/tools">
<data>
<variable
name="model"
type="com.qsafeguardiaseguridad.viewmodel.LoginViewModel" />
</data>
<ImageView
安卓:id="@+id/backgroundLayout"
安卓:layout_width="match_parent"
安卓:layout_height="match_parent"
安卓:layout_weight="4"
安卓:scaleType="centerCrop"
安卓:src="@drawable/ic_login" />
</layout>
查看(后勤活动)
public class LoginActivity extends AppCompatActivity {
//1) Inicio flujo en Activity
private LoginViewModel loginViewModel = null;
private ActivityLoginBinding activityLoginBinding = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login);
loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);
activityLoginBinding.setModel(loginViewModel);
loginViewModel.loginAnimation( activityLoginBinding); //should i do this?
}
}
视图模型(LoginView模型)
public class LoginViewModel extends AndroidViewModel {
public LoginViewModel(Application application) {
super(application);
}
public LiveData<String> getUserLiveData(){
return _userLiveData;
}
private final MutableLiveData<String> _userLiveData = new MutableLiveData<>();
private final MutableLiveData<String> _passwordLiveData = new MutableLiveData<>();
public LiveData<String> getPasswordLiveData(){
return _passwordLiveData;
}
//variables animacion
Animation topAnim, bottomAnim;
/*Aquí también se manejan los eventos del Activity, en este caso
* un onclick del botón del inicio de sesión*/
public void loginButtonClicked(String user, String password){
if(!user.isEmpty() && !password.isEmpty()){
Log.w("Test",user+" "+password);
LoginRepository.getToken(user, password, getApplication());
}
}
//Should i do this?
public void loginAnimation(ActivityLoginBinding activityLoginBinding){
//Animations
topAnim = AnimationUtils.loadAnimation(getApplication(), R.anim.top_animation);
bottomAnim = AnimationUtils.loadAnimation(getApplication(), R.anim.bottom_animation);
activityLoginBinding.backgroundLayout.setAnimation(topAnim);
activityLoginBinding.formLayout.setAnimation(topAnim);
activityLoginBinding.versionName.setAnimation(bottomAnim);
}
}
我做得对还是错
更新#1
尝试应用King的建议,这样的建议应该是正确的吗
查看(后勤活动)
public class LoginActivity extends AppCompatActivity {
//1) Inicio flujo en Activity
private LoginViewModel loginViewModel = null;
private ActivityLoginBinding activityLoginBinding = null;
//variables animacion
Animation topAnim, bottomAnim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityLoginBinding = DataBindingUtil.setContentView(this, R.layout.activity_login);
loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);
activityLoginBinding.setModel(loginViewModel);
topAnim = AnimationUtils.loadAnimation(getApplication(), R.anim.top_animation);
bottomAnim = AnimationUtils.loadAnimation(getApplication(), R.anim.bottom_animation);
activityLoginBinding.backgroundLayout.setAnimation(topAnim);
activityLoginBinding.formLayout.setAnimation(topAnim);
activityLoginBinding.versionName.setAnimation(bottomAnim);
}
# 1 楼答案
否不引用ViewModel中的视图;ViewModel具有生命周期意识。ViewModel在活动的整个生命周期中保持其状态,但必须避免对ViewModel中的视图或活动进行任何引用,因为这些(视图)在销毁时会引发NullPointerException。这最终会导致内存泄漏
动画应该在视图层中执行,活动和片段都是视图
可以在主活动中制作动画
在单独的片段中制作动画,即loginFragment