2016-06-03 2 views
4

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

Вот мой XML-код:

  <TextView 
       android:text="@{message.title}" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:layout_alignParentTop="true" 
       android:layout_marginBottom="5dp" 
       android:layout_marginTop="5dp" 
       android:layout_toLeftOf="@+id/timestamp" 
       android:textSize="18sp" 
       android:textStyle='@{message.isRead() ? "bold" : "normal"}' 
       android:textColor='@{message.isRead() ? 0xff313131 : 0xff0662ab}' /> 

Th colorchange работает прекрасно, только жирный текст дает мне некоторые проблемы.

Ошибка: выполнение выполнено для задачи ': app: compileDebugJavaWithJavac'.

java.lang.RuntimeException: Found data binding errors. ****/ data binding error ****msg:Cannot find the setter for attribute 'android:textStyle' with parameter type java.lang.String on android.widget.TextView. file:D:......xml loc:39:41 - 39:79 ****\ data binding error ****

+0

полужирный текст работает, если вы просто установить его статически, а не с помощью привязки данных? –

+0

Да, его работа затем –

+0

Илл. Редактирование в ошибке –

ответ

7

Я в конечном итоге, используя следующий код, он реализует DataBinding.

public abstract class BindingAdapter { 
    @android.databinding.BindingAdapter("android:typeface") 
    public static void setTypeface(TextView v, String style) { 
     switch (style) { 
      case "bold": 
       v.setTypeface(null, Typeface.BOLD); 
       break; 
      default: 
       v.setTypeface(null, Typeface.NORMAL); 
       break; 
     } 
    } 
} 

И XML

<TextView 
    android:text="@{bericht.titel}" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginBottom="5dp" 
    android:layout_marginTop="5dp" 
    android:layout_toLeftOf="@+id/timestamp" 
    android:textSize="18sp" 
    android:textColor='@{bericht.isGelezen() ? 0xff313131 : 0xff0662ab}' 
    android:typeface='@{bericht.isGelezen() ? "normal" : "bold"}' /> 
+0

Это правильное решение, но оно может использовать небольшую настройку: Связать с android: textStyle и использовать атрибут textStyle в XML. – Pepijn

-2

Вам нужно создать getMessageStyle в ваше сообщение Объект:

public String getMessageStyle() { 
    return isRead() ? "bold" : "normal"; 
} 

затем использовать, как показано ниже в код:

<TextView 
    android:text="@{message.title}" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true" 
    android:layout_marginBottom="5dp" 
    android:layout_marginTop="5dp" 
    android:layout_toLeftOf="@+id/timestamp" 
    android:textSize="18sp" 
    android:textStyle="@{message.getMessageStyle()}" 
    android:textColor="@{message.isRead() ? 0xff313131 : 0xff0662ab}" /> 
+0

Я пробовал это, это не сработало. Я нашел другой способ сделать это. Я отправлю свой ответ в ближайшее время. –

1

Саиф Bechan правильно в своем ответе, я сделал небольшое изменение, чтобы облегчить привязку данных из модели представления.

public abstract class BindingAdapter { 
    @android.databinding.BindingAdapter("app:textStyle") 
    public static void setTextStyle(TextView v, int style) { 
     v.setTypeface(null, style); 
    } 
} 

Тогда вы приносите в app пространство имен для вашего XML

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
... 
</layout> 

Создание привязки в модели представления

@Bindable 
public int getValueFormat() { 
    String message = getMyObject().getValue(); 
    if (message == MyObject.DEFAULT_VALUE) 
     return Typeface.ITALIC; 

    return Typeface.NORMAL; 
} 

Теперь вы можете связать это непосредственно

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:textStyle="@{viewModel.valueFormat}" 
    android:text="@{viewModel.value}" /> 
-3
  <?xml version="1.0" encoding="utf-8"?> 
      <layout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:app="http://schemas.android.com/apk/res-auto">  
      <data> 
       ... 
       <import type="android.graphics.Typeface"/> 
      </data> 
      ... 

     <LinearLayout ...> 

       <TextView 
       .... android:textStyle="@{item.viewed == 1 ? Typeface.NORMAL : Typeface.BOLD}" /> 
    </LinearLayout> 
+0

Это просто не работает, поэтому он становится нисходящим – tomrozb

0

Простой способ

public class TextViewBindingAdapter { 
    @BindingAdapter("isBold") 
    public static void setBold(TextView view, boolean isBold) { 
     if (isBold) { 
      view.setTypeface(null, Typeface.BOLD); 
     } else { 
      view.setTypeface(null, Typeface.NORMAL); 
     } 
    } 
} 

XML:

<TextView 
     android:id="@+id/text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:isBold="@{item.bold}"/> 
Смежные вопросы