数据绑定 - EditText的maxLength属性

时间:2017-03-07 15:20:15

标签: java android data-binding android-databinding

有没有办法通过Android应用程序中的双向数据绑定提供android:maxLength属性?

我现在拥有的是XML格式:

<EditText
                        android:id="@+id/edBody"
                        style="@style/SimpleEdit"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:clickable="false"
                        android:hint="@string/ComposeMessage"
                        android:text="@={viewModel.composeFace.body}"
                        android:maxLength="@={viewModel.inReplyMode ? viewModel.maxReplyLength : viewModel.maxMessageLength}"
                        android:afterTextChanged="@{viewModel.autoWatch}"
                        android:imeOptions="actionNext"
                        android:inputType="textMultiLine"/>

在视图模型中,我有以下属性:

/**
 * Maximum length of message body.
 */
@Bindable
public int maxMessageLength;

/**
 * Maximum length of reply message body.
 */
@Bindable
public int maxReplyLength;

构建期间抛出错误:

> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Cannot find the getter for attribute 'android:maxLength' with value type int on android.widget.EditText.
file:...\app\src\main\res\layout\f_message_compose.xml
loc:66:20 - 77:65
****\ data binding error ****

我知道引发此错误是因为文本长度没有简单的set方法,并且通常通过InputFilter提供,如下所述: How to programmatically set maxLength in Android TextView?

我可以想象它的工作方式如下:

android:maxLength="@={viewModel.replyLength}"

@Bindable
public InputFilter[] getReplyLength() {
    return isInReplyMode() ? new InputFilter[] { new InputFilter.LengthFilter(maxReplyLength) } : new InputFilter[] { new InputFilter.LengthFilter(maxMessageLength) };
}

但由于显而易见的原因,它不起作用。它实际上导致:

> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:The expression ((viewModelInReplyMode) ? (viewModelMaxReplyLength) : (viewModelMaxMessageLength)) cannot cannot be inverted: The condition of a ternary operator must be constant: android.databinding.tool.writer.KCode@7f305219
file:...\app\src\main\res\layout\f_message_compose.xml
loc:74:50 - 74:126
****\ data binding error ****

那么有没有可能的数据绑定最大长度属性的方法?

1 个答案:

答案 0 :(得分:0)

正如@pskink在评论中指出的那样 - 我的问题是使用双向数据绑定而不是maxLength属性的数据绑定。应该有:

android:maxLength="@{viewModel.inReplyMode ? viewModel.maxReplyLength : viewModel.maxMessageLength}"

而不是

android:maxLength="@={viewModel.inReplyMode ? viewModel.maxReplyLength : viewModel.maxMessageLength}"

这就是为什么没有&#34;没有针对android的getter方法:TextView的#maxLength属性&#34;异常。