2017-03-03 93 views
3

升級到Gradle 2.3後。我的項目無法編譯。我在日誌中的控制檯升級到Gradle 2.3後數據綁定崩潰了

incompatible types: ObservableInt cannot be converted to int

查看生成的文件

android.databinding.ObservableInt viewModelLoadingVisibility; 
this.vLoading.getRoot().setVisibility(viewModelLoadingVisibility); 

xml文件

<android.support.v7.widget.RecyclerView 
    android:id="@+id/rvProducts" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/white" 
    android:visibility="@{viewModel.contentVisibility}" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
/> 

我的方法試了,我綁定類

@BindingAdapter("app:visibility") 
public static void setViewVisible(View view, ObservableInt visible) { 
     int visibility = visible.get(); 
     view.setVisibility(visibility); 
} 

and got log

警告:屬性app:visibility的應用程序名稱空間將被忽略。

public static void setViewVisible(View view, ObservableInt visible) { 

警告:ObservableField和原始表兄弟直接用作方法參數已被棄用,支持將很快被移除。使用內容作爲參數,而不是方法公共靜態無效setViewVisible(android.view.View,android.databinding.ObservableInt)

public static void setViewVisible(View view, ObservableInt visible) { 

任何人遇到這種情形?

回答

0
android:visibility="@{viewModel.contentVisibility}" 

記住這個

dataBinding { 
    enabled = true 
} 

重新下載從在Android SDK管理器支持存儲庫的庫。

+0

還沒有佔上風? – Remario

+0

發生錯誤,看到一次。 – Remario

+0

你的回答在這種情況下不起作用。數據綁定已啓用 –

1

你只需要添加到您的build.gradle依賴的底部:

apt 'com.android.databinding:compiler:2.3.0' 
+0

我試過這個,但它給了我一個編譯錯誤「Gradle DSL method not found:'apt()'」 –

+0

@DanPonce嘗試使用'annotationProcessor'而不是'apt'(或者如果您使用Kotlin則使用'kapt')因爲'android-apt'已被棄用。我回答了另一個問題[這裏](http://stackoverflow.com/a/42868218/809572)。 –

1

這看起來像一個錯誤。請把它歸檔。有很多測試,我們不期望這種迴歸。我們需要確定具體示例,這一點很重要,所以我們可以確定它已被捕獲。

您現在可以忽略警告。

首先是因爲這個原因造成的:因爲我們支持ObservableInt作爲參數

@BindingAdapter("visibility") 

二是:

@BindingAdapter("app:visibility") 

你應該這樣改爲使用。您通常不想接受ObservableInt,而是接受int。我希望看到ObservableInt是必要的用例。我們可能只是刪除該警告並始終支持它,或者如果沒有有效的用途,我們可以將支持ObservableInt的插頭作爲參數。

----- -----編輯

我有一個小的應用程序測試這一點,我沒有任何問題,沒有任何BindingAdapter。這裏是佈局:

<layout> 
    <data> 
     <variable name="model" type="com.example.gmount.testobservableint.MyModel"/> 
    </data> 
    <android.support.constraint.ConstraintLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:onClick="@{model::clicked}" 
      tools:context="com.example.gmount.testobservableint.MainActivity"> 

     <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Hello World!" 
       app:layout_constraintBottom_toBottomOf="parent" 
       app:layout_constraintLeft_toLeftOf="parent" 
       app:layout_constraintRight_toRightOf="parent" 
       app:layout_constraintTop_toTopOf="parent" 
       android:visibility="@{model.visibility}" 
     /> 

    </android.support.constraint.ConstraintLayout> 
</layout> 

這裏是我的模型:

public class MyModel { 
    public final ObservableInt visibility = new ObservableInt(View.VISIBLE); 

    public void clicked(View view) { 
     int oldVisibility = visibility.get(); 
     int newVisibility = oldVisibility == View.VISIBLE ? View.GONE : View.VISIBLE; 
     visibility.set(newVisibility); 
    } 
} 

即使當我用BindingAdapter服用ObservableInt,它的工作。這裏是我的BindingAdapter:

@BindingAdapter("visiblity") 
public static void setVisibility(View view, ObservableInt visibility) { 
    view.setVisibility(visibility.get()); 
} 

我改變了搜索的結合是:

<TextView ... 
      app:visibility="@{model.visibility}" 
    /> 

是否有關於您viewModel不同的東西?

+0

我曾嘗試'@BindingAdapter(「知名度」)',它沒有工作。我正在使用數據綁定和MVVM模式來控制視圖狀態。例如,發生錯誤,'ErrorView'顯示; 'ContentView'隱藏。它意味着'ObservableInt'' errorViewVisibility.set(View.VISIBLE)'和'ObservableInt'' contentViewVisibility.set(View.GONE)'。在Gradle 2.2.3上,一切都很好,然後在2.3上停下來。 –

+0

你試過BindingAdapter(「android:visibility」)嗎? –

+0

我嘗試了所有這些。沒有工作 –

相關問題