Я недавно нашел что-то под названием databinding на android, и это показалось мне очень интересным, поэтому я приступил к реализации этого в одном из моих проектов, которые собираюсь начать.Все работает как надо, когда я делаю привязку данных в текстовом представлении, но если я пытаюсь сделать это в текстовом редакторе, компилятор выдает ошибку.После этого я начал следовать учебному пособию на 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>
view
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);
}
}
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 модуль:app
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 <- это то, что консоль говорит </p>
Класс автоматически сгенерированный, который выдает мне ошибку:
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, у меня есть пакет для модели, пакет для представленияи пакет для viewModel.Но недавно я обнаружил, что если я помещаю все классы в основную папку, вне пакетов, упомянутых выше, компилятор прекращает отправку ошибки, и приложение компилируется правильно.Итак, почему это происходит и как я могу продолжать использовать классы в пакетах, упомянутых выше, не генерируя ошибку, которую посылает компилятор?
Спасибо!