如何将可变数量的参数传递给数据绑定适配器?

时间:2017-02-15 18:29:24

标签: android arrays android-databinding

我在布局中有Spinner和一些EditText。我想将EditText的类型绑定到Spinner的状态。即

  • for FLOAT 所有Spinner组件的EditText输入类型的状态必须更改为浮点数
  • for INTEGER 输入类型必须为整数

为了实现这个目的,我在下面定义了绑定适配器:

@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。这个例子非常简化,可以包含逻辑错误,但它完全解释了我想要实现的目标。

2 个答案:

答案 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 - 您需要添加错误或其他内容以防止这种情况发生。