2016-06-03 6 views
4

Ziemlich einfach, ich möchte einen Titel einer Nachricht Fett machen basierend darauf, ob der Text es gelesen wird oder nicht. Ich kann keine Lösung dafür finden.Wie Fettdruck mit Android Datenbindung Bibliothek

Hier ist meine XML-Code:

  <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 Farbwechsel funktioniert großartig, nur die fett gedruckten Text mir einige Probleme gibt.

Fehler: Ausführung fehlgeschlagen für Task ': 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

Ist fett gedruckten Text zu arbeiten, wenn Sie es nur statisch eingestellt, nicht mit Datenbindung? –

+0

Ja, es funktioniert dann –

+0

Ill edit in den Fehler –

Antwort

7

Ich landete mit dem folgenden Code, Es implementiert 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; 
     } 
    } 
} 

Und die 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

Dies ist die richtige Lösung, aber es könnte eine kleine Anpassung verwenden: Binden Sie mit Android: TextStyle und verwenden Sie das TextStyle-Attribut in Ihrem XML. – Pepijn

-2

Sie benötigen getMessageStyle in Ihre Nachricht Objekt zu erstellen:

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

dann verwenden, wie unten in Ihren Code:

<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

Ich versuchte dies, das hat nicht funktioniert. Ich habe einen anderen Weg gefunden, dies zu tun. Ich werde meine Antwort in Kürze posten. –

1

Saif Bechan korrekt in seiner Antwort, habe ich eine leichte Veränderung Datenbindung aus einem View-Modell zu erleichtern.

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

Dann bringen Sie im app Namespace zu Ihrem XML

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

ein Erstellen der View-Modell Bindung

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

    return Typeface.NORMAL; 
} 

Jetzt können Sie diese direkt binden

<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

Das funktioniert einfach nicht, darum wird es runtergeregelt – tomrozb

0

Eine einfache Möglichkeit,

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}"/> 
Verwandte Themen