2016-05-02 6 views
4

includeタグを使用してカスタムビューをDataBindingを使用するアクティビティレイアウトに追加しようとしています。私のカスタムビューはDataBindingも使用しています。Androidデータバインディングがカスタム表示レイアウトでインクルードタグを使用するとクラッシュする

05-02 17:30:03.685 12595-12595/? E/AndroidRuntime: FATAL EXCEPTION: main 
                Process: com.novachevskyi.databindingtest, PID: 12595 
                java.lang.RuntimeException: Unable to start activity ComponentInfo{com.novachevskyi.databindingtest/com.novachevskyi.databindingtest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.novachevskyi.databindingtest.databinding.CustomViewBinding.invalidateAll()' on a null object reference 
                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                 at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                 at android.os.Looper.loop(Looper.java:148) 
                 at android.app.ActivityThread.main(ActivityThread.java:5417) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.novachevskyi.databindingtest.databinding.CustomViewBinding.invalidateAll()' on a null object reference 
                 at com.novachevskyi.databindingtest.databinding.ActivityMainBinding.invalidateAll(ActivityMainBinding.java:41) 
                 at com.novachevskyi.databindingtest.databinding.ActivityMainBinding.<init>(ActivityMainBinding.java:33) 
                 at com.novachevskyi.databindingtest.databinding.ActivityMainBinding.bind(ActivityMainBinding.java:105) 
                 at android.databinding.DataBinderMapper.getDataBinder(DataBinderMapper.java:11) 
                 at android.databinding.DataBindingUtil.bind(DataBindingUtil.java:185) 
                 at android.databinding.DataBindingUtil.bindToAddedViews(DataBindingUtil.java:299) 
                 at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:279) 
                 at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261) 
                 at com.novachevskyi.databindingtest.MainActivity.onCreate(MainActivity.java:11) 
                 at android.app.Activity.performCreate(Activity.java:6251) 
                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
                 at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
                 at android.os.Handler.dispatchMessage(Handler.java:102)  
                 at android.os.Looper.loop(Looper.java:148)  
                 at android.app.ActivityThread.main(ActivityThread.java:5417)  
                 at java.lang.reflect.Method.invoke(Native Method)  
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

MainActivity:

public class MainActivity extends AppCompatActivity { 
    @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    DataBindingUtil.setContentView(this, R.layout.activity_main); 
    } 
} 

のCustomView:

public class CustomView extends LinearLayout { 
    public CustomView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    @Override protected void onFinishInflate() { 
    super.onFinishInflate(); 
    DataBindingUtil.bind(this); 
    } 
} 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     tools:context="com.novachevskyi.databindingtest.MainActivity"> 

    <include layout="@layout/custom_view"/> 

    </RelativeLayout> 

</layout> 

custom_view.xml:

しかし、私は、アプリケーションの起動時にクラッシュしました
<?xml version="1.0" encoding="utf-8"?> 
<layout 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <com.novachevskyi.databindingtest.CustomView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <TextView 
     android:text="Hello World!" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    </com.novachevskyi.databindingtest.CustomView> 

</layout> 

私もサンプルプロジェクトで、公共のレポを作成しました:私はcom.android.tools.build:gradle:2.1.0にビルドツールのバージョンをアップグレードしようとしたとき、私は私が直面しています、今com.android.tools.build:gradle:1.3.1でデータバインディングを使用した https://github.com/novachevskyi/DataBinding-issue

この問題は、include xmlタグを含むすべてのビューで発生します。上記の問題に関する情報をお寄せいただきありがとうございます。

+0

まだ進捗はありませんか? – zgulser

+0

この行は問題を作成しますDataBindingUtil.bind(this);私は本当にあなたが何を望んでいるのか理解していない、データバインディングの機能を使用しないためです。より多くの情報を与える –

答えて

0

私はあなたのプロジェクトを見て、それを実行しました。私はあなたがそれがクラッシュしなくなりますDataBindingUtil.bind(this)を削除した場合、それがクラッシュした理由が原因

@Override protected void onFinishInflate() { 
    super.onFinishInflate(); 
    DataBindingUtil.bind(this); 
} 

のだと思います。その理由は、バインド呼び出しがビューを囲む<layout>を探していますが、それを見つけることができないために例外がスローされるからです。 CustomView自体にバインドを呼び出しているので、それは私はあなたが達成しようとしているが、活動をすることをやっているので、冗長になるonFinishInflateの内部bindを呼び出しているのか全くわからないんだけどthrow new IllegalArgumentException("View is not a binding layout")

ViewDataBindingの原因となるものに囲まれていませんアクティビティのレイアウトをバインドするときにあなたのために。 CustomViewクラス内のバインディングが必要な場合は、次の操作を実行できます。

@Override protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    CustomViewBinding binding = DataBindingUtil.findBinding(this); 
} 
関連する問題