2016-12-25 18 views
3

我正嘗試使用數據綁定創建自定義視圖。下面是自定義視圖代碼:Android數據綁定,視圖標記在視圖上不正確:null

package com.xxx.myapplication; 

import android.content.Context; 
import android.databinding.DataBindingUtil; 
import android.util.AttributeSet; 
import android.widget.FrameLayout; 

import com.xxx.myapplication.databinding.DataviewBinding; 

/** 
* Created by atp on 12/25/2016. 
*/ 
public class DataView extends FrameLayout { 
    DataviewBinding binding; 

    public DataView(Context context) { 
     super(context); 
    } 

    public DataView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DataView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public DataView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     binding = DataviewBinding.bind(this); 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     Customer customer = new Customer(); 
     customer.firstName = "Custom view "; 
     binding.setDataSource(customer); 
    } 
} 

我創建了一個佈局文件dataview.xml和上述內部的自定義視圖中使用:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:tools="http://schemas.android.com/tools"> 
    <data> 
     <variable 
      name="dataSource" 
      type="com.xxx.myapplication.Customer" /> 
    </data> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
     <com.xxx.myapplication.DataView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="@{dataSource.firstName}" /> 
     </com.xxx.myapplication.DataView> 
    </LinearLayout> 
</layout> 

然後,我包括在我的活動佈局dataview.xml:

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

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/activity_vertical_margin" 
     android:paddingLeft="@dimen/activity_horizontal_margin" 
     android:paddingRight="@dimen/activity_horizontal_margin" 
     android:paddingTop="@dimen/activity_vertical_margin"> 

     <include layout="@layout/dataview"/> 
    </RelativeLayout> 
</layout> 

但是當我運行該程序,我得到以下異常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{---}:android.view.InflateException: Binary XML file line #13: view tag isn't correct on view:null 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2464) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524) 
at android.app.ActivityThread.access$900(ActivityThread.java:154) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:234) 
at android.app.ActivityThread.main(ActivityThread.java:5526) 
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: android.view.InflateException: Binary XML file line #13: view tag isn't correct on view:null 
at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284) 
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 
at com.xxx.myapplication.MainActivity.onCreate(MainActivity.java:16) 
at android.app.Activity.performCreate(Activity.java:6285) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)  
at android.app.ActivityThread.access$900(ActivityThread.java:154)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:234)  
at android.app.ActivityThread.main(ActivityThread.java:5526)  
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.RuntimeException: view tag isn't correct on view:null 
at com.xxxx.myapplication.databinding.DataviewBinding.bind(DataviewBinding.java:128) 
at com.xxx.myapplication.databinding.DataviewBinding.bind(DataviewBinding.java:124) 
at com.xxx.myapplication.DataView.onFinishInflate(DataView.java:35) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:844) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:838) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:971) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:831) 
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)  
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140)  
at com.xxx.myapplication.MainActivity.onCreate(MainActivity.java:16)  
at android.app.Activity.performCreate(Activity.java:6285)  
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)  
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)  
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)  
at android.app.ActivityThread.access$900(ActivityThread.java:154)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391)   
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:234)  
at android.app.ActivityThread.main(ActivityThread.java:5526)  
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)  
+1

嘗試從'dataview.xml'中刪除'LinearLayout' – pskink

+0

@pskink我將線性佈局移動到'com.varanegar.myapplication.DataView'中並且工作正常。看起來我們應該使用自定義視圖作爲佈局的直接子。如果我誤解了,請糾正我。感謝您的幫助 –

+0

@pskink請回答這個問題,我可以接受它。 –

回答

1

我相信你需要以下命名空間添加到您的dataview.xml的xmlns:程序= 「http://schemas.android.com/apk/res-auto」

所以它成爲這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto 
xmlns:tools="http://schemas.android.com/tools"> 
    <data> 
     <variable 
      name="dataSource" 
      type="com.xxx.myapplication.Customer" /> 
    </data> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 
     <com.xxx.myapplication.DataView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 
      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="@{dataSource.firstName}" /> 
     </com.xxx.myapplication.DataView> 
    </LinearLayout> 
</layout> 
3

有現在已被固定在數據的結合,其中在充氣過程中的結合引起問題的一個錯誤。如果您將綁定移至充氣步驟之後(不幸的是,onFinishInflate()仍然計算在充氣過程中),那麼您將避免該缺陷。這應該在Android Studio 2.3中解決。

+0

差不多一年過去了,我正面臨Android Studio 3.0.1的這個問題。在我的情況下,我有一個使用數據綁定的自定義視圖,該數據綁定在數據綁定片段中多次使用。我想我會使用老式的find-by-id方式從視圖中刪除綁定,並在這一點上繼續僅在片段上使用綁定。 – Ambran

3

當我在不同的模塊中使用同一名稱的多個佈局時,我遇到了同樣的問題,但是當充氣時我引用了沒有數據綁定的那個(不是以layout標籤開頭的那個)。

1

通常你會得到這個錯誤,因爲你試圖綁定你的DataBinding到已經有另一個DataBinding連接到它的視圖。

爲了確保沒有任何東西已經綁定到您的視圖,請嘗試DataBindingUtils.getBinding(view)。它將返回視圖的當前DataBinding,因此您可以重用它,而不是嘗試創建新的DataBinding。