Android Kotlin学习(二)- ViewModel
创建实体类
创建User实体类,可以选择Data类型,类似于java语言中的Bean对象。
data class User(var name:String,var pwd:String,var rePwd:String)
ViewModel
创建ViewModel时需要使用到继承,Kotlin的继承直接使用:就行:
//注意这里的父类构造函数需要实际调用
class 子类 : 父类 {
//子类函数体
override fun 被重写的父类方法名 ( 被重写的父类方法参数 ){
//要执行的函数内容
}
}
这里需要继承AndroidViewModel,子类需要在主构造函数中定义需要的变量 , 其中的参数 , 可以直接传递给后面委托调用的主构造函数 :
class LoginViewModel(application: Application) : AndroidViewModel(application) {
}
添加LiveData,在kotlin中,类的每一个属性都会产生一getter,一个setter,这里就不需要再写了
class LoginViewModel(application: Application) : AndroidViewModel(application) {
var loginLD : MutableLiveData<User> = MutableLiveData<User>();
}
添加点击事件
open class LoginViewModel() : ViewModel() {
var TAG = "LoginViewModel";
var userLd : MutableLiveData<User> = MutableLiveData<User>();
fun onLogin(v:View){
Log.i(TAG,"login ${userLd.value?.name} ${userLd.value?.pwd}");
}
}
?加在变量之后,系统任何情况都不会抱他的空指针异常。意思就是允许该变量值为null。该变量如果为null时,不会执行该变量后面的逻辑,也不会抛出空指针异常,俗称空安全。如果不为null,会正常执行该变量后面的内容。
修改布局文件
<data>
<variable
name="user"
type="com.kotlin.demo.viewmodel.LoginViewModel" />
</data>
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_name"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@={vm.userLd.name}"></com.google.android.material.textfield.TextInputEditText>
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_pwd"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="@={vm.userLd.pwd}"></com.google.android.material.textfield.TextInputEditText>
<com.google.android.material.button.MaterialButton
android:id="@+id/btn_login"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:onClick="@{vm.onLogin}"
android:text="登录" />
Activity配置ViewModel
class LoginActivity : AppCompatActivity() {
val TAG = "LoginActivity";
lateinit var binding: ActivityLoginBinding;
lateinit var mViewModel: LoginViewModel;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_login);
//绑定生命周期
binding.lifecycleOwner = this;
initVM();
}
private fun initVM() {
mViewModel = ViewModelProvider(this).get(LoginViewModel::class.java);
//绑定ViewModel
binding.vm = mViewModel;
mViewModel.userLd.postValue(User("test","123456","123456890"));
}
}