有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    否不引用ViewModel中的视图;ViewModel具有生命周期意识。ViewModel在活动的整个生命周期中保持其状态,但必须避免对ViewModel中的视图或活动进行任何引用,因为这些(视图)在销毁时会引发NullPointerException。这最终会导致内存泄漏

    动画应该在视图层中执行,活动和片段都是视图

    1. 可以在主活动中制作动画

    2. 在单独的片段中制作动画,即loginFragment