Android数据绑定-找不到属性的getter
我看进去后用了一些旋转装订。但是在那之后我就不能编译代码了 错误 发现数据绑定错误。 ****/数据绑定错误****msg:在android.widget.Spinner上找不到值类型为java.lang.String的属性“selectedValue”的getter。 文件:D:\Khemraj\u AndroidStudioWorkspace\u\amelioFinal\app\src\main\res\layout\activity\u cart.xml 地点:167:24-175:33 ****\数据绑定错误**** 波乔 在xml中Android数据绑定-找不到属性的getter,android,android-layout,android-databinding,Android,Android Layout,Android Databinding,我看进去后用了一些旋转装订。但是在那之后我就不能编译代码了 错误 发现数据绑定错误。 ****/数据绑定错误****msg:在android.widget.Spinner上找不到值类型为java.lang.String的属性“selectedValue”的getter。 文件:D:\Khemraj\u AndroidStudioWorkspace\u\amelioFinal\app\src\main\res\layout\activity\u cart.xml 地点:167:24-175:33
<variable
name="viewModel"
type="com.amelio.model.ViewModel"/>
及
bindingUtil
public class SpinnerBindingUtil {
@BindingAdapter(value = {"selectedValue", "selectedValueAttrChanged"}, requireAll = false)
public static void bindSpinnerData(AppCompatSpinner pAppCompatSpinner, String newSelectedValue, final InverseBindingListener newTextAttrChanged) {
pAppCompatSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
newTextAttrChanged.onChange();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
if (newSelectedValue != null) {
int pos = ((ArrayAdapter<String>) pAppCompatSpinner.getAdapter()).getPosition(newSelectedValue);
pAppCompatSpinner.setSelection(pos, true);
}
}
@InverseBindingAdapter(attribute = "selectedValue", event = "selectedValueAttrChanged")
public static String captureSelectedValue(AppCompatSpinner pAppCompatSpinner) {
return (String) pAppCompatSpinner.getSelectedItem();
}
}
公共类SpinnerBindingUtil{
@BindingAdapter(值={“selectedValue”,“selectedValueAttrChanged”},requireAll=false)
公共静态void bindSpinnerData(AppCompatSpinner pAppCompatSpinner、字符串newSelectedValue、最终反转BindingListener newTextAttrChanged){
pAppCompatSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener()文件){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
newTextAttrChanged.onChange();
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
if(newSelectedValue!=null){
int pos=((ArrayAdapter)pAppCompatSpinner.getAdapter()).getPosition(newSelectedValue);
pAppCompatSpinner.setSelection(位置,正确);
}
}
@InverseBindingAdapter(attribute=“selectedValue”,event=“selectedValueAttrChanged”)
公共静态字符串captureSelectedValue(AppCompatSpinner pAppCompatSpinner){
返回(字符串)pAppCompatSpinner.getSelectedItem();
}
}
有一个android:selectedItemPosition属性,支持开箱即用的双向数据绑定。您可以使用它或使用它的BindingAdapter
/InverseBindingAdapter
对作为模板:
@InverseBindingMethods({
@InverseBindingMethod(type = AdapterView.class, attribute = "android:selectedItemPosition"),
@InverseBindingMethod(type = AdapterView.class, attribute = "android:selection",
method = "getSelectedItemPosition",
event = "android:selectedItemPositionAttrChanged"),
})
这会让我做这样的事情:
@InverseBindingMethods({
@InverseBindingMethod(type = AdapterView.class,
attribute = "android:selectedValue",
method = "getSelectedItem"
})
public class SelectedValueBindingAdapter {
@BindingAdapter("android:selectedValueAttrChanged")
public static void setSelectedValueListener(AdapterView view,
final InverseBindingListener attrChanged) {
if (attrChanged == null) {
view.setOnItemSelectedListener(null);
} else {
view.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
attrChanged.onChange();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
attrChanged.onChange();
}
});
}
}
@BindingAdapter("android:selectedValue")
public static void setSelectedValue(AdapterView<?> view, Object selectedValue) {
Adapter adapter = view.getAdapter();
if (adapter == null) {
return;
}
// I haven't tried this, but maybe setting invalid position will
// clear the selection?
int position = AdapterView.INVALID_POSITION;
for (int i = 0; i < adapter.getCount(); i++) {
if (adapter.getItem(i) == selectedValue) {
position = i;
break;
}
}
view.setSelection(position);
}
}
@InverseBindingMethods({
@InverseBindingMethod(类型=AdapterView.class,
attribute=“android:selectedValue”,
方法=“getSelectedItem”
})
公共类SelectedValueBindingAdapter{
@BindingAdapter(“android:selectedValueAttrChanged”)
公共静态无效设置SelectedValueListener(AdapterView视图,
最终反演发现(已更改){
if(attrChanged==null){
view.setOnItemSelectedListener(空);
}否则{
view.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
attrChanged.onChange();
}
@凌驾
未选择公共无效(AdapterView父级){
attrChanged.onChange();
}
});
}
}
@BindingAdapter(“android:selectedValue”)
公共静态无效设置selectedValue(AdapterView视图,对象selectedValue){
Adapter=view.getAdapter();
if(适配器==null){
返回;
}
//我还没有尝试过这个,但是设置无效的位置可能会
//清除所选内容?
int位置=AdapterView.INVALID_位置;
对于(inti=0;i
我认为ViewModel
类应该为属性设置getter和setter,即setSelectedValue()
和getSelectedValue()
我不这么认为,它是一个属性而不是model类的变量。我得到的答案是14票,奇怪。
@InverseBindingMethods({
@InverseBindingMethod(type = AdapterView.class, attribute = "android:selectedItemPosition"),
@InverseBindingMethod(type = AdapterView.class, attribute = "android:selection",
method = "getSelectedItemPosition",
event = "android:selectedItemPositionAttrChanged"),
})
@BindingAdapter("android:selectedItemPosition")
public static void setSelectedItemPosition(AdapterView view, int position) {
if (view.getSelectedItemPosition() != position) {
view.setSelection(position);
}
}
@BindingAdapter(value = {"android:onItemSelected", "android:onNothingSelected",
"android:selectedItemPositionAttrChanged" }, requireAll = false)
public static void setOnItemSelectedListener(AdapterView view, final OnItemSelected selected,
final OnNothingSelected nothingSelected, final InverseBindingListener attrChanged) {
if (selected == null && nothingSelected == null && attrChanged == null) {
view.setOnItemSelectedListener(null);
} else {
view.setOnItemSelectedListener(
new OnItemSelectedComponentListener(selected, nothingSelected, attrChanged));
}
}
@InverseBindingMethods({
@InverseBindingMethod(type = AdapterView.class,
attribute = "android:selectedValue",
method = "getSelectedItem"
})
public class SelectedValueBindingAdapter {
@BindingAdapter("android:selectedValueAttrChanged")
public static void setSelectedValueListener(AdapterView view,
final InverseBindingListener attrChanged) {
if (attrChanged == null) {
view.setOnItemSelectedListener(null);
} else {
view.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
attrChanged.onChange();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
attrChanged.onChange();
}
});
}
}
@BindingAdapter("android:selectedValue")
public static void setSelectedValue(AdapterView<?> view, Object selectedValue) {
Adapter adapter = view.getAdapter();
if (adapter == null) {
return;
}
// I haven't tried this, but maybe setting invalid position will
// clear the selection?
int position = AdapterView.INVALID_POSITION;
for (int i = 0; i < adapter.getCount(); i++) {
if (adapter.getItem(i) == selectedValue) {
position = i;
break;
}
}
view.setSelection(position);
}
}