2016-03-03 86 views
25

我在使用app:srcCompat &的Support Lib v23.2中使用新矢量可繪製支持,試圖通過數據綁定設置其可繪製。與srcCompat的數據綁定

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

<data> 
    <variable 
     name="mediaPojo" 
     type="in.ishaan.pika.data_binding.MediaPojo"/> 
</data> 

<RelativeLayout 
    android:background="@color/black" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <VideoView 
     ... /> 

    <ImageView 
     ... 
     app:srcCompat="@{mediaPojo.isPlaying ? @drawable/ic_pause_24dp : @drawable/ic_play_arrow_24dp}" 
    /> 

    <ProgressBar 
     .../> 
</RelativeLayout> 
</layout> 

在試圖建立,工作室拋出:

Error:(33, 30) Cannot find the setter for attribute 'app:srcCompat' with parameter type android.graphics.drawable.Drawable.

+0

您是否在佈局的根元素上包含'xmlns:app =「http://schemas.android.com/apk/res-auto」'屬性? –

+0

@PaulDS是的,讓我用全佈局更新這個問題 –

回答

34

您可以簡單地使用android:src當你通過DataBinding設置矢量資源時,屬性改爲compat屬性。

DataBinding庫生成在運行時執行setImageResource方法的類。

<ImageView 
     ... 
     android:src="@{@drawable/your_drawable}" 
/> 

根據http://android-developers.blogspot.com/2016/02/android-support-library-232.htmlsetImageResource方法可以在運行時使用較舊版本的系統沒有任何額外的更改。

如果您想使用app:srcCompat屬性。您必須定義@BindingMethods註釋,它將連接屬性與來自ImageView的適當設置器相連接。例如在Activity或Fragment中添加。

@BindingMethods({ 
    @BindingMethod(type = android.widget.ImageView.class, 
      attribute = "app:srcCompat", 
      method = "setImageDrawable") }) 
public class MainActivity extends AppCompatActivity { 
    // your activity body here 

} 
+0

_「DataBinding庫生成在運行時執行setImageResource方法的類。」_ 您確定嗎?你不能打開綁定類,所以我們如何確定? –

+1

我檢查了兩件事情: 1.採用了android時顯示預棒棒糖設備矢量繪製:src屬性和數據綁定(它顯示無異常) 2. One軟件engeeniers在谷歌工作的說,在這裏(在表達式樹(8 :01)部分)https://realm.io/news/data-binding-android-boyar-mount/關於使用setImageResource方法匹配src屬性 – lukjar

+0

此外,您可以嘗試在代碼中查找ImageViewBindingAdapter。它是用於綁定ImageView的DataBinding庫中的適配器。在生成的代碼中,您可以找到對此適配器的引用。 您可以使用NotePad ++打開生成的類,例如:)因爲Android Studio默認打開xml佈局。 它們存儲在app \ build \ intermediates \ classes \ your \ package \ name \ databinding – lukjar

0

提出的答案主要是爲我工作,但我還需要在我的應用程序中加入這一行:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 

這樣做可以讓我在舊版本使用矢量繪圖資源,而無需擔心COMPAT類或屬性

+0

請記住,使用此標誌會導致內存問題(https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88) –