2016-12-31 1 views
1

У меня есть TextView в моем приложении, которое усугубляется ключом из файла ресурсов strings.xml и параметром, который передается динамически. Я использую привязку данных Android, где '??' обозначение означает, что он должен заменить нули пустыми строками, как показано ниже. Но когда значение параметра равно нулю, пока TextView не будет заполнен данными, мы увидим что-то вроде «null min», когда мне это нравится: «min».Android DataBinding "??" обозначение и параметризованная строка из ресурсов. Как избежать «нулевого» текста?

<TextView 
    android:id="@+id/text_runtime" 
    android:layout_width="wrap_content" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:padding="2dp" 
    android:text="@{@string/min(vm.runtime) ?? ``}" 
    tools:text="120 min" /> 

в strings.xml:

<string name="min"> 
    <xliff:g id="min">%d</xliff:g> 
    min 
</string> 

enter image description here enter image description here

ответ

3

vm.runtime может быть нулевым, но это возможно допустимый параметр для строкового формата, поэтому считается действительным, и ?? никогда не будет оценен.

Одно из выражений вы можете использовать это:

<TextView 
    android:id="@+id/text_runtime" 
    android:layout_width="wrap_content" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:padding="2dp" 
    android:text="@{vm.runtime == null ? `` : @string/min(vm.runtime)}" 
    tools:text="120 min" /> 

Если вы хотите, чтобы иметь min вместо пустой строки, вы можете форматировать строку дважды.

<TextView 
    android:id="@+id/text_runtime" 
    android:layout_width="wrap_content" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:padding="2dp" 
    android:text="@{@string/min(@string/quantity(vm.runtime) ?? ``)}" 
    tools:text="120 min" /> 

И ваш мин определяется следующим образом:

<string name="min"> 
    <xliff:g id="min">%s</xliff:g> 
    min 
</string> 

И струна количество будет просто:

<string name="quantity">%d</string> 

Я думаю, что это должно форматировать правильно на всех языках, хотя бы рекомендуется использовать множественные числа вместо строки в течение минуты, если вы планируете локализовать.

+1

Вы правы, я не видел, чтобы это было слишком просто. Между тем, пытался супер обходной путь: http://stackoverflow.com/questions/41418764/android-databinding-can-i-pass-constructor-parameter-to-my-data-variable – alexpfx

+0

Фактически это '' не работает ... Не могли бы вы отправить действительное решение для записи пустой строки в Data Binding? благодаря – Fer

1

Вы используете целочисленное заполнитель в ваших строках XLIFF:

<xliff:g id="min">%d</xliff:g> 

и проходящими там пустая строка. Измените свои строки xliff, чтобы использовать заполнитель строки:

<xliff:g id="min">%s</xliff:g> 

И конвертировать vm.runtime в строку.

Смежные вопросы