2016-05-02 67 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:

https://github.com/novachevskyi/DataBinding-issue

我所用數據與com.android.tools.build:gradle:1.3.1結合現在,當我試圖升級構建工具版本com.android.tools.build:gradle:2.1.0,我面對:

<?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> 

我還創建了公共回購與示例項目這個問題與我所有包含include xml標籤的視圖有關。希望瞭解有關上述問題的任何信息。

+0

仍然沒有進展? – zgulser

+0

這行創建問題DataBindingUtil.bind(this);我真的不明白你想要什麼,因爲你不使用數據綁定的功能。提供更多信息 –

回答

0

我看了一下你的項目並運行它。我認爲這是崩潰的原因是因爲

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

如果您刪除DataBindingUtil.bind(this)將停止崩潰。原因是綁定調用正在尋找圍繞視圖的<layout>,但它無法找到它,因此會引發異常。由於CustomView呼籲本身綁定它不會被任何東西造成ViewDataBinding包圍throw new IllegalArgumentException("View is not a binding layout")

我不是很確定你想要什麼來實現,但調用bindonFinishInflate內將是多餘的,因爲該活動是這樣做爲你綁定活動的佈局。如果您需要CustomView類別內的綁定,您可以執行以下操作:

@Override protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    CustomViewBinding binding = DataBindingUtil.findBinding(this); 
} 
相關問題