我在布局中有Spinner
和一些EditText
。我想将EditText
的类型绑定到Spinner
的状态。即
Spinner
组件的EditText
输入类型的状态必须更改为浮点数为了实现这个目的,我在下面定义了绑定适配器:
@BindingAdapter(value = {"bind:selectedValueAttrChanged", "bind:relatedInputs"}, requireAll = false)
public static void setMeasurementUnit(final Spinner spinner, final InverseBindingListener listener, final AppCompatEditText... relatedInputs){
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
listener.onChange();
String selectedUnit = (String) spinner.getSelectedItem();
for (EditText editText : relatedInputs) {
if (editText == null) continue;
if (selectedUnit.equals("INTEGER"))
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
else if(selectedUnit.equals("FLOAT"))
editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
}
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
listener.onChange();
}
});
}
并在布局文件中将EditText
绑定到Spinner
:
<LinearLayout>
<android.support.v7.widget.AppCompatEditText
android:id="@+id/edit_text_1"/>
<android.support.v7.widget.AppCompatSpinner
bind:relatedInputs="@{editText1}"/>
</LinearLayout>
它在编译时产生错误:
data binding error ****msg:Cannot find the setter for attribute 'bind:relatedInputs' with parameter type android.support.v7.widget.AppCompatEditText on android.support.v7.widget.AppCompatSpinner.
当我尝试声明并传递EditText
<android.support.v7.widget.AppCompatSpinner
bind:relatedInputs="@{new AppCompatEditText[]{editText1, editText2}}"/>
我遇到语法错误:
data binding error ****msg:Syntax error: extraneous input 'AppCompatEditText' expecting {<EOF>, ',', '.', '::', '[', '+', '-', '*', '/', '%', '<<', '>>>', '>>', '<=', '>=', '>', '<', 'instanceof', '==', '!=', '&', '^', '|', '&&', '||', '?', '??'}
或
P.S。这个例子非常简化,可以包含逻辑错误,但它完全解释了我想要实现的目标。
答案 0 :(得分:1)
Android数据绑定不允许您传入varargs。每个属性可能只有一个值。您可以将列表或数组作为属性值传递,但不能动态创建它们(表达式语言中不允许new
)。
最好反转问题并根据所选项目将android:inputType
属性分配给表达式。
<LinearLayout>
<android.support.v7.widget.AppCompatEditText
android:inputType="@{Converters.getInputType(spinner1.selectedItem)}"/>
<android.support.v7.widget.AppCompatSpinner
android:id="@+id/spinner1"/>
</LinearLayout>
您还需要转换器类:
public class Converters {
public static int getInputType(Object obj) {
if (!(obj instanceof String)) {
return InputType.TYPE_CLASS_TEXT; // Don't know what to do
}
String selectedUnit = (String) obj;
if (selectedUnit.equals("INTEGER")) {
return InputType.TYPE_CLASS_NUMBER;
} else if(selectedUnit.equals("FLOAT")) {
return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL;
}
return InputType.TYPE_CLASS_TEXT; // Don't know what to do
}
}
答案 1 :(得分:0)
另一种方法是:
DataSource
为您的微调器添加一个监听器:
//create a Observable for the input type:
public final ObservableInt decOrInt = new ObservableInt(InputType.TYPE_NUMBER_FLAG_DECIMAL);
在您的xml中,对于您想要的每个binding.spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
decOrInt.set(i != 0 ?
InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL :
InputType.TYPE_CLASS_NUMBER);
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
decOrInt.set(InputType.TYPE_CLASS_NUMBER);
}
});
:
EditText
十进制输入对应<!-- act would be the class where you store your decOrInt-->
<EditText
android:id="@+id/edit_text"
android:inputType="@{act.decOrInt}" />
,整数输入对应InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL
。
可以输入一个浮点数并将选择更改为int - 您需要添加错误或其他内容以防止这种情况发生。