2017-01-20 2 views
1

Я использую привязку данных в своем приложении. У меня есть модуль приложения, и привязка данных работает успешно.DataBinding не работает в модуле

Однако, у меня также есть «дом-модуль» Я пытаюсь использовать те же методы, но данные связывания erroring в XML со следующим:

Error:(63, 34) No resource type specified (at 'onClick' with value '@{viewModel::onButtonClicked}').

Я нашел this bug report что предполагает, что это проблема, но она исправлена.

Я не вижу проблем с кодом, я думаю, проблема в том, что она находится в библиотечном модуле.

Есть ли что-нибудь, что я могу сделать, чтобы это сработало?

дом-модуль

activity_home.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="viewModel" type="com.flowmellow.projectx.home.ui.viewmodel.HomeViewModel"/> 
    </data> 

    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/home_screen" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     tools:context="com.flowmellow.projectx.home.ui.viewmodel.HomeActivity"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/AppTheme.AppBarOverlay"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:popupTheme="@style/AppTheme.PopupOverlay"/> 

     </android.support.design.widget.AppBarLayout> 

     <android.support.constraint.ConstraintLayout 
      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" 
      android:id="@+id/content_main" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" 
      tools:context="com.flowmellow.projectx.home.ui.viewmodel.HomeActivity"> 

      <TextView 
       android:text="@string/activity_home_title" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:id="@+id/activity_home_title" 
       android:textAppearance="@style/TextAppearance.AppCompat.Large" 
       android:layout_marginStart="16dp" 
       app:layout_constraintLeft_toLeftOf="parent" 
       android:layout_marginLeft="16dp" 
       android:layout_marginEnd="16dp" 
       app:layout_constraintRight_toRightOf="parent" 
       android:layout_marginRight="16dp" 
       app:layout_constraintBottom_toTopOf="@+id/activity_home_button" 
       android:layout_marginBottom="64dp" /> 

      <Button 
       android:text="@string/activity_home_button" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:id="@+id/activity_home_button" 
       style="@style/Widget.AppCompat.Button.Colored" 
       android:onClick="@{viewModel::onButtonClicked}"/> 

     </android.support.constraint.ConstraintLayout> 

    </android.support.design.widget.CoordinatorLayout> 
</layout> 

HomeActivity

public class HomeActivity extends AppCompatActivity { 

    private HomeViewModel mHomeViewModel; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     final SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     final CustomSensorManager customSensorManager = new CustomSensorManager(sensorManager); 
     mHomeViewModel = new HomeViewModel(customSensorManager); 

     setBindingContentView(R.layout.activity_home); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
    } 

    private void setBindingContentView(@LayoutRes int layoutResID) { 
     ActivityHomeBinding binding = DataBindingUtil.setContentView(this, layoutResID); 
     binding.setViewModel(mHomeViewModel); 
    } 
} 

HomeViewModel

public class HomeViewModel { 

    private CustomSensorManager mSensorManager; 

    public HomeViewModel(@NonNull CustomSensorManager sensorManager) { 
     mSensorManager = sensorManager; 
    } 

    public void onButtonClicked(View view) { 
     mSensorManager.scan(true); 
    } 
} 

build.gradle

apply plugin: 'com.android.library' 
android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.0" 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    dataBinding { 
     enabled = true 
    } 
} 
dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 

    compile 'com.android.support:appcompat-v7:25.0.0' 
    compile 'com.android.support:design:25.0.0' 
    compile 'com.android.support.constraint:constraint-layout:+' 
} 

Update:

Может быть ошибка. link

Моя проблема:

enter image description here

Модуль двигателя не имеет пользовательского интерфейса, так что зависимость была упущена, делает много смысла в настоящее время.

+0

У вас есть привязка данных, включенная как в библиотеке, так и в модулях приложения? –

+0

Да, включен в прикладном модуле –

+1

Я только что протестировал это, и он работает. Я подозреваю, что у вас также нет привязки данных в библиотечном модуле. –

ответ

4

Скажет, у вас есть многоуровневая иерархия модулей, как это в вашем приложении:

Multilevel module hierarchy in Android

Для того, чтобы привязки данных для работы модуля А, вы должны убедиться, что вы включите привязку данных в всей иерархии от корневой модуль в модуле А.

Это означает, что вы должны добавить:

dataBinding { 
    enabled = true 
} 

Для модулей:

  • модуль приложения
  • модуль А
  • модуль B

Важно помнить, что вы делаете есть также включить привязку данных в module B, так что все пути покрыты.

+0

Да! Это была моя проблема, у меня был другой модуль, зависящий от home-модуля. Работая теперь отлично спасибо. –

Смежные вопросы