2016-08-07 11 views
0

IntelliJ IDEAで動作する双方向データバインディングを取得できないという問題に直面しています。一方向バインディングは正常に動作します。ここでAndroid双方向データバインディングが動作しない(IntelliJ IDEA)

は私の設定です:

IntelliJ IDEA Ultimate 2016.2.1

Android API: 24

Java: 1.8.0_102

Gradle: 2.14.1

は、ここに私のbuild.gradleファイルされる:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 
<data> 
    <variable name="customer" type="com.example.xyz.model.Customer"/> 
</data> 
<LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="10dp"> 
    <TextView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="@{Integer.toString(customer.age)}" 
       tools:text="33"/> 
    <EditText 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{customer.name}"/> 
</LinearLayout> 

apply plugin: 'com.android.application' 
android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.1" 

defaultConfig { 
    applicationId "com.example.xyz" 
    minSdkVersion 17 
    targetSdkVersion 24 
    versionCode 1 
    versionName "1.0" 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
    debug { 
     debuggable true 
    } 
} 
dataBinding { 
    enabled = true 
} 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:support-v4:24.1.1' 
    compile 'com.android.support:design:24.1.1' 
} 

ここではlayout.xml(片道結合)であります

彼女eは、Customerクラスです:

android:text="@={customer.name}" 

まず、:

public class Customer extends BaseObservable { 
private String name; 
private int age; 

@Bindable 
public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

@Bindable 
public int getAge() { 
    return age; 
} 

public void setAge(int age) { 
    this.age = age; 
}} 

これは、私は次のように次の行を変更することにより、結合双方向データをしようとするが、結合一方向のデータのためだけで正常に動作します構文はエラーで(のIntelliJで赤色に変わります)認識されていません:「/"....andコンパイラエラーが表示されないことである:

Error:Gradle: Execution failed for task ':app:compileDebugJavaWithJavac'. java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Cannot find the getter for attribute 'android:text' with value type java.lang.String on android.widget.EditText. file:C:\Source\Android\test\app\src\main\res\layout\test_layout.xml loc:24:33 - 24:43 ****\ data binding error ****

はまだのIntelliJでサポートされていないバインディング双方向のデータであり、または私は何行方不明?属性android:textデータバインディングについては

+0

これは古いデータバインディングフレームワークを利用しているような感じです。最新のAndroid Gradleプラグインを使用していることを確認してください。Android Studioでは、これはトップレベルの 'build.gradle'ファイルにあります。 – CommonsWare

+0

Android Studioではなく、IntelliJ IDEAを使用しています。 Android SDKのバージョン、Gradleのバージョンなどは上記の私の記事にあります。 –

+1

"AndroidスタジオではなくIntelliJ IDEAを使用しています" - わかっています。しかし、私はIDEAを使用せず、IDEAプロジェクトのどこにGradle版のAndroidプラグインがあるのか​​わかりません。したがって、Android Studioプロジェクトに所属する場所を参考にして指摘しました。 「Android Plugin for Gradle」(https://developer.android.com/studio/releases/gradle-plugin.html)ではなく、「Android SDKバージョン、Gradleバージョンなどは私のポストにあります」 。 Android Plugin for Gradleは、あなたの質問に表示されているGradleスクリプトに 'apply plugin: 'com.android.application''を持つことができるものです。 – CommonsWare

答えて

0

私はこれらのスライドからの情報に基づいて、それを考え出した:

http://www.slideshare.net/radekpiekarz/deep-dive-into-android-data-binding

  1. を、プロジェクトのトップレベルbuild.gradleファイル、Gradleのでは:2.1.0以上が必要です。最新のバージョンがインストールされていても、それをgradle:2.0.0に設定しました。私はこれが@CommonsWareが参照しているAndroid Gradleプラグインのバージョンだと推測しています。ここに私の修正されたトップレベルbuild.gradleは:

    buildscript { 
        repositories { 
         jcenter() 
        } 
        dependencies { 
         classpath 'com.android.tools.build:gradle:2.1.0' 
        } 
    } 
    
    allprojects { 
        repositories { 
         jcenter() 
        } 
    } 
    
    task clean(type: Delete) { 
        delete rootProject.buildDir 
    } 
    
  2. Gradleのバージョンを固定した後、のIntelliJ IDEAは、まだエラーとして構文を強調表示しますが、プロジェクトはうまくコンパイルされます。ただし、双方向データバインディング自体はまだ機能しませんでした。その部分を修正するには、私は、CustomerクラスにnameプロパティのセッターへnotifyPropertyChanged(BR.name)を追加しました:この後

    public class Customer extends BaseObservable { 
        private String name; 
        private int age; 
    
        @Bindable 
        public String getName() { 
         return name; 
        } 
    
        public void setName(String name) { 
         this.name = name; 
         notifyPropertyChanged(BR.name); 
        } 
    
        @Bindable 
        public int getAge() { 
         return age; 
        } 
    
        public void setAge(int age) { 
         this.age = age; 
        } 
    } 
    

を、期待通りに結合作品 - 私は余分なアダプタまたは複数のコードを追加する必要はありませんでした。

+0

これは私を助けました。ありがとう – xrnd

0

StringEditText期待戻り値の型にいくつかのgetText()を呼び出そう。しかし、CharSequenceを返すので、このゲッターを自分で定義する必要があります。

@InverseBindingAdapter(attribute = "android:text") 
public static String captureTextValue(TextView view) { 
    return view.getText().toString(); 
} 
+0

ありがとうございます - 私はAndroidに慣れていません - このアダプタを置く場所と、既存のコードに接続する方法を説明してください。私もここで見ましたが、全体の例がどのように表示されるかはまだ分かりません。 https://developer.android.com/reference/android/databinding/InverseBindingAdapter.html –

+0

@AAbramsこのドキュメントはありませんまだ大きな価値。反映されていない変更がいくつかあり、そこにも明らかなエラーがあります。最後に、このアダプタをどこにでも置くことができます。私はこのために静的ユーティリティクラスを使用しました。フックは自動的に行われます。 – tynn

関連する問題