数据绑定 - EditText 的 maxLength 属性

6 浏览
0 Comments

数据绑定 - 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 ****

所以有没有可能通过数据绑定来绑定最大长度属性?

0
0 Comments

问题的原因是在使用双向数据绑定时,错误地将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"异常的问题。

0