Android 上的简单 MVVM 架构,Java 上的 AndroidX
Simple MVVM architecture on Android with AndroidX on Java
我真的很生气,想弄清楚这个混蛋是如何创建一个简单的 MVVM 模式的 Android activity.
我想要的只是将视图模型 public 方法(打印 "Eureka!" 日志)绑定到按钮(带有 onClick 操作)。
为了实现这一点,我现在所做的是:
data_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="it.XXXXX.XXXXX.ui.data.DataActivity"
>
<data>
<variable
name="viewModel"
type="it.XXXXX.XXXXX.ui.data.DataViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/some_useless_id_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
tools:text="Press this beautiful button ;)" />
<Button
android:id="@+id/some_useless_id_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.test()}"
android:text="@string/button" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
DataViewModel.java
package it.XXXXX.XXXXX.ui.data;
import android.util.Log;
import androidx.lifecycle.ViewModel;
public class DataViewModel extends ViewModel {
public void test() {
Log.d("test", "EUREKA!");
}
}
DataActivity.java
package it.XXXXX.XXXXX.ui.data;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import it.XXXXX.XXXXX.R;
public class DataActivity extends AppCompatActivity {
private DataViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.data_activity);
this.mViewModel = new ViewModelProvider(this).get(DataViewModel.class);
}
}
...最后(因为我正在处理现有的应用程序)我调用视图:
...
((Button)this.findViewById(R.id.btnDataSync2)).setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
Intent i = new Intent(MainActivity.this, DataActivity.class);
MainActivity.this.startActivity(i);
}
});
...
预期的行为是通过按下 DataView(已加载)来读取日志,但没有任何反应(按钮按下动画除外)。
有人知道问题出在哪里吗?
提前致谢!
Step to enable data binding in an Android app:
add android.databinding.enableV2=true
in your "gradle.properties" file;
add dataBinding { enabled = true }
in the app "build.gradle" file, in the android section:
android {
compileSdkVersion 28
...
dataBinding {
enabled = true
}
}
- 运行 a gradle sync and build in Android Studio.
Update
I forgot to tell you have to modify your onCreate
method like this:
package it.XXXXX.XXXXX.ui.data;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import it.XXXXX.XXXXX.R;
import it.XXXXX.XXXXX.databinding.DataActivityBinding;
public class DataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DataViewModel mViewModel = new DataViewModel();
DataActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.data_activity);
binding.setViewModel(mViewModel);
}
}
我认为我没有正确绑定 Activity
中的 ViewModel
:
DataActivity.java
public class DataActivity extends AppCompatActivity {
private DataViewModel mViewModel;
private DataActivityBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mViewModel = new DataViewModel();
this.mBinding = DataBindingUtil.setContentView(this, R.layout.data_activity);
this.mBinding.setViewModel(this.mViewModel);
}
}
希望这对某人有所帮助。
Ps。感谢 @medaip90 的有用建议!
我真的很生气,想弄清楚这个混蛋是如何创建一个简单的 MVVM 模式的 Android activity.
我想要的只是将视图模型 public 方法(打印 "Eureka!" 日志)绑定到按钮(带有 onClick 操作)。
为了实现这一点,我现在所做的是:
data_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="it.XXXXX.XXXXX.ui.data.DataActivity"
>
<data>
<variable
name="viewModel"
type="it.XXXXX.XXXXX.ui.data.DataViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/some_useless_id_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
tools:text="Press this beautiful button ;)" />
<Button
android:id="@+id/some_useless_id_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.test()}"
android:text="@string/button" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
DataViewModel.java
package it.XXXXX.XXXXX.ui.data;
import android.util.Log;
import androidx.lifecycle.ViewModel;
public class DataViewModel extends ViewModel {
public void test() {
Log.d("test", "EUREKA!");
}
}
DataActivity.java
package it.XXXXX.XXXXX.ui.data;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import it.XXXXX.XXXXX.R;
public class DataActivity extends AppCompatActivity {
private DataViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.data_activity);
this.mViewModel = new ViewModelProvider(this).get(DataViewModel.class);
}
}
...最后(因为我正在处理现有的应用程序)我调用视图:
...
((Button)this.findViewById(R.id.btnDataSync2)).setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
Intent i = new Intent(MainActivity.this, DataActivity.class);
MainActivity.this.startActivity(i);
}
});
...
预期的行为是通过按下 DataView(已加载)来读取日志,但没有任何反应(按钮按下动画除外)。
有人知道问题出在哪里吗?
提前致谢!
Step to enable data binding in an Android app:
add
android.databinding.enableV2=true
in your "gradle.properties" file;add
dataBinding { enabled = true }
in the app "build.gradle" file, in the android section:
android {
compileSdkVersion 28
...
dataBinding {
enabled = true
}
}
- 运行 a gradle sync and build in Android Studio.
Update
I forgot to tell you have to modify your onCreate
method like this:
package it.XXXXX.XXXXX.ui.data;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import it.XXXXX.XXXXX.R;
import it.XXXXX.XXXXX.databinding.DataActivityBinding;
public class DataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DataViewModel mViewModel = new DataViewModel();
DataActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.data_activity);
binding.setViewModel(mViewModel);
}
}
我认为我没有正确绑定 Activity
中的 ViewModel
:
DataActivity.java
public class DataActivity extends AppCompatActivity {
private DataViewModel mViewModel;
private DataActivityBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mViewModel = new DataViewModel();
this.mBinding = DataBindingUtil.setContentView(this, R.layout.data_activity);
this.mBinding.setViewModel(this.mViewModel);
}
}
希望这对某人有所帮助。
Ps。感谢 @medaip90 的有用建议!