Android DataBinding——视图标记在视图上不正确:null

3
我的类继承自LinearLayout,我使用DataBinding来填充布局。但是代码抛出了一个异常,说它的视图标签在view:null上不正确。
这是我的代码:
public class DietListView extends LinearLayout {
    private LayoutDietListViewBinding mBinding;
    private List<?> mDietList = new LinkedList<>();
    private LayoutInflater mInflater;

    public DietListView(Context context) {
        this(context,null);
    }

    public DietListView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

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

    private void initView(Context context) {
        mInflater = LayoutInflater.from(context);
        mBinding = DataBindingUtil.inflate(mInflater, R.layout.layout_diet_list_view, null, false);
        addView(mBinding.getRoot());

     }
}

布局文件是:
<?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"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>

</data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        .....

    </LinearLayout>
</layout>

这里有一个类似的问题,包含了与你完全相同的错误。 https://dev59.com/lJDea4cB1Zd3GeqPWhGX - user6302485
我看过了,但它不起作用。我在自定义视图类中使用了数据绑定,但我不知道是否正确。 - OstAlex
我无法重现这个问题。你使用的是哪个版本的Android gradle插件?我使用的是Android Studio 2.1和随附的插件进行测试。也有可能是你正在膨胀一个非绑定布局文件。 - George Mount
3个回答

4

这与一个bug有关。当你在填充时进行数据绑定,它会让数据绑定框架感到困惑。尝试延迟填充直到数据绑定框架完成,看看是否可以解决问题。该bug应该在android gradle plugin 2.2(Android Studio 2.2)中得到修复,但不会在I/O 2016预览版中提供。

https://code.google.com/p/android/issues/detail?id=204890


3
我现在面临这个问题。它能在运行时正常工作,但无法在预览中工作。有没有办法立即解决这个问题? - FireDragonMule
1
一年过去了,我正在面对Android Studio 3.0.1的这个问题。在我的情况下,我有一个使用数据绑定的自定义视图,在数据绑定片段中多次使用。我想我会使用传统的按ID查找方式从视图中删除绑定,并继续仅在片段上使用绑定,在这一点上。 - Ambran

3

这可能不是最好的方法(更像一个解决方案),但我做的是添加isInEditMode()方法,填充布局然后立即退出,代码如下:

LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);    
if(isInEditMode()){
            inflater.inflate(R.layout.your_layout, this);
            return;
        }

绑定视图后,您可以保留预览功能。

0

上面的回答很有帮助,目前我正在这样使用它,在预览中成功显示且没有错误,在运行时也可以正常工作:

if (isInEditMode) {
    LayoutInflater.from(context).inflate(R.layout.layout_keyboard, this, true)
} else {
    binding = LayoutKeyboardBinding.inflate(LayoutInflater.from(context), this, true)
}

请阅读一下 isInEditMode 是什么:Android 开发文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接