2016-12-25 31 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。