Есть ли способ предоставить атрибут android:maxLength
с помощью двусторонней привязки данных в приложении Android?
В настоящее время у меня есть это в 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 ****
Я понимаю, что эта ошибка возникает из-за того, что не существует простого метода установки длины текста, и она обычно предоставляется через InputFilter
, как описано здесь: Как программно установить maxLength в 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 ****
Итак, есть ли какой-либо способ привязать атрибут максимальной длины к привязке данных?
BindingAdapter
дляandroid:maxLength
, см .: androidxref.com/7.1.1_r6/xref/frameworks/data-binding/, для чего вам нужна двусторонняя привязка? - person pskink   schedule 08.03.2017@=
перед атрибутом, а использовать только@
! В этом разница между привязкой данных и двусторонней привязкой данных. Похоже, я пропустил это в спецификации :) - person Pepa Novotný   schedule 08.03.2017@=
используется, когда напр.EditText
хочет связать какую-то строку модели и отобразить ее как содержимое и обратно, когда вы ее измените, изменения должны быть сопоставлены с моделью строки - person pskink   schedule 08.03.2017