gpt4 book ai didi

java - 在数据绑定(bind)布局中使用子组件时,如何让子组件正确编译?

转载 作者:行者123 更新时间:2023-12-02 00:46:23 26 4
gpt4 key购买 nike

我有一个 java 数据绑定(bind)布局,正在另一个 java 数据绑定(bind)布局中使用。单独查看时,子组件会正确渲染,但是当我在 super 组件的设计 View 中查看时,它不会渲染子组件,并且在设计 View 错误面板中的“无法实例化一个或多个类”下出现空引用错误。它按预期编译并运行。查看自动生成的 BindingImpl 文件内部,不会生成任何使用数据绑定(bind)的 View 的引用,因此出现引用错误。如何让子组件正确实例化?

如果我从 xml 中删除所有数据绑定(bind)并放入代码中,该组件将在设计 View 中正确显示(但达不到使用它的一半目的)。项目编译正确,没有错误,尽管设计 View 显示除了“无法实例化...”错误之外还存在错误

[自动生成]ComponentNumberPickerBindingImpl.java

static {
sIncludes = null;
sViewsWithIds = new android.util.SparseIntArray();
sViewsWithIds.put(R.id.number_picker_minus_button, 2);
sViewsWithIds.put(R.id.number_picker_plus_button, 3);
}

private ComponentNumberPickerBindingImpl(androidx.databinding.DataBindingComponent bindingComponent, View root, Object[] bindings) {
super(bindingComponent, root, 1
, (android.widget.ImageButton) bindings[2]
, (android.widget.ImageButton) bindings[3]
, (android.widget.TextView) bindings[1]
);
this.mboundView0 = (android.widget.LinearLayout) bindings[0];
this.mboundView0.setTag(null);
this.numberPickerText.setTag(null); // java.lang.NullPointerException error here
setRootTag(root);
// listeners
invalidateAll();
}

component_number_picker.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>

<variable
name="numberPicker"
type="shared.NumberPicker" />

<variable
name="target"
type="androidx.lifecycle.MutableLiveData&lt;Integer>" />
</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<ImageButton
android:id="@+id/number_picker_minus_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/border_circular"
android:contentDescription="@string/desc_remove_large_luggage_button"
android:src="@drawable/ic_remove_24px" />

<TextView
android:id="@+id/number_picker_text"
style="@style/TextAppearance.AppCompat.Large"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:minWidth="60dp"
android:textAlignment="center"
tools:text="9"
android:text="@{`` + target}"/>

<ImageButton
android:id="@+id/number_picker_plus_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/border_circular"
android:contentDescription="@string/desc_add_large_luggage_button"
android:src="@drawable/ic_add_24px" />

</LinearLayout>
</layout>

NumberPicker.java

package shared;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;

import androidx.lifecycle.MutableLiveData;

import databinding.ComponentNumberPickerBinding;

public class NumberPicker extends LinearLayout {

ComponentNumberPickerBinding mBinding;

public NumberPicker(Context context) {
super(context);
initialiseViews(context);
}

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

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

private void initialiseViews(Context context) {
mBinding = ComponentNumberPickerBinding.inflate(LayoutInflater.from(context), this, true);
mBinding.setNumberPicker(this);
}

public MutableLiveData<Integer> getTarget() {
return mBinding.getTarget();
}

public void setTarget(MutableLiveData<Integer> value) {
mBinding.setTarget(value);
}

}

包括

<shared.NumberPicker
android:id="@+id/luggage_specifier_number_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

最佳答案

所以,我相信这是在设计 View 中使用数据绑定(bind)代码时的一个错误。我在运行时跟踪应用程序代码,并注意到它正在为子组件中的每个 View 分配一个标记(我看不到发生这种情况的位置,大概是在 DataBinding 设置中的某个位置),这些 View 由 ViewDataBinding 使用类来分配给绑定(bind)实现中的 View 属性。

但是,在使用设计 View 时,这些标记似乎不会被设置,因此 View 永远不会添加到 View 绑定(bind)数组中,因此永远不会分配给 View 属性。

我找到了一个解决方法,即手动分配标签(例如,binging_1、binging_2 等)。当代码构建时,它会找到标签并正确分配它们,并且 View 将按预期呈现。

更新经过更多挖掘后,绑定(bind)标签似乎在那里,但由于某种原因没有被拾取 - 这两个布局来自自动生成的 component_number_picker.xml请注意,TextView 有一个“originalTag”属性,而 ImageView 则没有。在此示例中,我将布局 xml 中的标签添加到 TextView,但没有添加到 ImageView。在设计 View 中查看时,TextView 可以正确实例化,但 ImageView 会导致 NullReferenceError。

<Target id="@+id/number_picker_text" originalTag="binding_2" tag="binding_2"
view="TextView">
<Expressions>
<Expression attribute="android:text" text="`` + target">
<Location endLine="50" endOffset="40" startLine="50" startOffset="12" />
<TwoWay>false</TwoWay>
<ValueLocation endLine="50" endOffset="38" startLine="50" startOffset="28" />
</Expression>
</Expressions>
<location endLine="51" endOffset="36" startLine="40" startOffset="8" />
</Target>
<Target id="@+id/number_picker_plus_button" tag="binding_3" view="ImageButton">
<Expressions>
<Expression attribute="android:onClick" text="()-&gt;numberPicker.increment(1)">
<Location endLine="61" endOffset="61" startLine="61" startOffset="12" />
<TwoWay>false</TwoWay>
<ValueLocation endLine="61" endOffset="59" startLine="61" startOffset="31" />
</Expression>
</Expressions>
<location endLine="61" endOffset="63" startLine="53" startOffset="8" />
</Target>

关于java - 在数据绑定(bind)布局中使用子组件时,如何让子组件正确编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com