проблемы с Android DataBinding - PullRequest
       7

проблемы с Android DataBinding

0 голосов
/ 17 декабря 2018

Я недавно нашел что-то под названием 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.Но недавно я обнаружил, что если я помещаю все классы в основную папку, вне пакетов, упомянутых выше, компилятор прекращает отправку ошибки, и приложение компилируется правильно.Итак, почему это происходит и как я могу продолжать использовать классы в пакетах, упомянутых выше, не генерируя ошибку, которую посылает компилятор?

Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Несколько вещей:

1) Ваш xml должен начинаться и заканчиваться на:

<layout>
 ...

</layout >

2) Вам нужно добавить следующие строки в build.gradle вашего модуля:

android {
    ....
    dataBinding {
        enabled = true
    }
}
...