数据绑定 - EditText 的 maxLength 属性
数据绑定 - EditText 的 maxLength 属性
在Android应用程序中,有没有一种通过双向数据绑定来提供android:maxLength
属性的方法?
我目前在XML中有以下内容:
在ViewModel中,我有以下属性:
/** * 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 ****
我理解这个错误是因为没有简单的设置文本长度的方法,通常可以通过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 ****
所以有没有可能通过数据绑定来绑定最大长度属性?
问题的原因是在使用双向数据绑定时,错误地将android:maxLength属性用于数据绑定。解决方法是将双向数据绑定的等号去掉,改为单向数据绑定。
解决方法如下:
将原来的代码:
android:maxLength="@={viewModel.inReplyMode ? viewModel.maxReplyLength : viewModel.maxMessageLength}"
改为:
android:maxLength="@{viewModel.inReplyMode ? viewModel.maxReplyLength : viewModel.maxMessageLength}"
这样就解决了出现"no getter method for android:maxLength attribute of TextView"异常的问题。