【发布时间】:2019-05-17 08:36:49
【问题描述】:
我最近在 android 上发现了一个叫做数据绑定的东西,它看起来很有趣,所以我开始在我将要开始的一个项目中实现它。当我在 textview 中进行数据绑定时,一切正常,但如果我尝试在 edittext 中进行,编译器会生成错误。之后,我开始学习 YouTube 上的一个教程,它的教学方式对我来说似乎非常好,但尽管我按照他说的所有步骤进行操作,但我并没有成功。
有人可以帮我吗?
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="student2"
type="com.juan97.prueba.ViewModel.Student2ViewModel"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_marginTop="50sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="@{student2.hint1}"/>
<TextView
android:layout_marginTop="50sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:hint="@{student2.hint2}"/>
</LinearLayout>
</layout>
查看
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding activityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
Student2ViewModel viewModel = new Student2ViewModel(new Student2("usuario", "contrasena"));
activityMainBinding.setStudent(viewModel);
}
}
视图模型
public class Student2ViewModel {
private String email;
private String password;
private String hint1;
private String hint2;
public Student2ViewModel(Student2 student2) {
this.hint1 = student2.hint1;
this.hint2 = student2.hint2;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getHint1() {
return hint1;
}
public void setHint1(String hint1) {
this.hint1 = hint1;
}
public String getHint2() {
return hint2;
}
public void setHint2(String hint2) {
this.hint2 = hint2;
}
}
型号
public class Student2 {
private String email;
private String password;
public String hint1;
public String hint2;
public Student2(String hint1, String hint2) {
this.hint1 = hint1;
this.hint2 = hint2;
}
public Student2() {
email = null;
password = null;
hint1 = null;
hint2 = null;
}
}
build.gradle 模块:应用程序
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.juan97.prueba"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding { <- this is the library that I need to use dataBinding
enabled = true
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
编译错误
错误:找不到符号类 ViewModel
自动生成的类给我错误:
import android.databinding.Bindable;
import android.databinding.DataBindingComponent;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.juan97.prueba.ViewModel; <- error here, so everything that has viewModel contains an error
public abstract class ActivityMainBinding extends ViewDataBinding {
@Bindable
protected ViewModel.Student2ViewModel mStudent2; <- error here
protected ActivityMainBinding(DataBindingComponent _bindingComponent, View _root,
int _localFieldCount) {
super(_bindingComponent, _root, _localFieldCount);
}
public abstract void setStudent2(@Nullable ViewModel.Student2ViewModel student2); <- error here
@Nullable
public ViewModel.Student2ViewModel getStudent2() { <- error here
return mStudent2;
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup root, boolean attachToRoot) {
return inflate(inflater, root, attachToRoot, DataBindingUtil.getDefaultComponent());
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup root, boolean attachToRoot, @Nullable DataBindingComponent component) {
return DataBindingUtil.<ActivityMainBinding>inflate(inflater, com.juan97.prueba.R.layout.activity_main, root, attachToRoot, component);
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, DataBindingUtil.getDefaultComponent());
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable DataBindingComponent component) {
return DataBindingUtil.<ActivityMainBinding>inflate(inflater, com.juan97.prueba.R.layout.activity_main, null, false, component);
}
public static ActivityMainBinding bind(@NonNull View view) {
return bind(view, DataBindingUtil.getDefaultComponent());
}
public static ActivityMainBinding bind(@NonNull View view,
@Nullable DataBindingComponent component) {
return (ActivityMainBinding)bind(component, view, com.juan97.prueba.R.layout.activity_main);
}
}
(更新)
在我的项目中,由于我希望应用 MVVM 模式,我有一个模型包、一个视图包和一个视图模型包。但最近我发现,如果我将所有类放在主文件夹中,在上述包之外,编译器会停止发送错误并且应用程序可以正确编译。那么,为什么会发生这种情况,我该如何继续使用上述包中的类而不产生编译器发送的错误?
谢谢!
【问题讨论】:
-
你有什么解决办法吗? @juan
标签: android mvvm android-databinding