Datenbindung: Eigenschaft festlegen, wenn sie nicht null ist

Lesezeit: 4 Minuten

Kann nicht verstehen … Wie kann man eine Ansichtseigenschaft nur dann festlegen, wenn das Variablenfeld nicht null ist?

Zum Beispiel

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="item"
            type="com.test.app.Item" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:layout_margin="16dp"
            android:src="https://stackoverflow.com/questions/36227194/@{item.getDrawable()}"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginEnd="16dp"
            android:layout_marginLeft="72dp"
            android:layout_marginRight="16dp"
            android:layout_marginStart="72dp"
            android:layout_toLeftOf="@id/action"
            android:layout_toStartOf="@id/action"
            android:orientation="vertical">

            <TextView
                android:id="@+id/text1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:textColor="@color/black_87"
                android:textSize="16sp"
                android:text="@{item.getTitle()}"/>

            <TextView
                android:id="@+id/text2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:autoLink="web|email"
                android:linksClickable="false"
                android:singleLine="true"
                android:textColor="@color/black_54"
                android:textSize="14sp"
                android:text="@{item.getSubtitle()}"/>


        </LinearLayout>

    </RelativeLayout>
</layout>

Einige Felder von Item können null sein und ich werde nicht unnötig Methoden von Layoutansichten aufrufen. Und ich werde nicht bekommen NullPointerException. Wie kann ich die Eigenschaft nur festlegen, wenn sie nicht null ist?

PS Entschuldigung für Englisch.

  • Wie von @Khemraj erwähnt, müssen Sie die Nullzulässigkeit von Werten nicht überprüfen, es sei denn, Sie möchten einige spezielle Werte für den Nullable-Fall festlegen. Datenbindungsausdrücke stellen dies kostenlos für Sie bereit

    – Versteckter Droid

    27. April 2019 um 18:45 Uhr

Nun, die Datenbindung vermeidet NullPointerException im Allgemeinen, indem sie danach sucht und den Standardwert (z. B. null) zuweist, selbst wenn item selbst ist in Ihrem Beispiel null.

Aber ein einfaches Beispiel für Nullprüfungen für die Eigenschaften des Elements:

android:text="@{item.title != null ? user.title : ""}"

Oder verwenden Sie den “Null Coalescing Operator”. Der Null-Koaleszenzoperator (??) wählt den linken Operanden, wenn er nicht null ist, oder den rechten, wenn er null ist.

android:text="@{item.title ?? ""}"

Beachten Sie, dass title oder getTitle spielt keine Rolle.

  • Ich weiß es. Wie ich verstanden habe, ist es unmöglich, die Methode in View nicht aufzurufen, wenn der Wert null ist.

    – Denis Sologub

    25. März 2016 um 20:26 Uhr

  • Es tut mir leid, dass ich nicht sicher bin, was Sie hier fragen. Versuchen Sie, den vorherigen Wert beizubehalten, wenn der neue Wert null war? Ich bin mir nicht sicher, ob dies eine gute Möglichkeit ist, dies durch Datenbindung zu erreichen. Die neue bidirektionale Datenbindung könnte meiner Meinung nach verwendet werden, indem der Wert eines (möglicherweise anderen) Objekts festgelegt wird, wenn es nicht null ist. Aber ich bezweifle, dass dies ein guter Weg ist.

    – Mattias Isegran Bergander

    25. März 2016 um 20:33 Uhr

  • Eine Möglichkeit wäre, die stattdessen verwendete Variable aufzuteilen und stattdessen eine für jede Eigenschaft zu haben. Vom Typ String statt Item.

    – Mattias Isegran Bergander

    25. März 2016 um 20:34 Uhr

  • Sollte gut funktionieren und auch die Datenbindung für die Sichtbarkeit verwenden! android:visibility="@{item.drawable == null ? View.INVISIBLE : View.VISIBLE}" Sie müssten einen Import für View in der hinzufügen data Element aber: <import type="android.view.View"/>

    – Mattias Isegran Bergander

    25. März 2016 um 20:39 Uhr


  • Aah ImageView mag dort null nicht. Schlagen Sie vor, es dann auf ein leeres oder transparentes Drawable auf Null zu setzen.

    – Mattias Isegran Bergander

    25. März 2016 um 20:46 Uhr

Benutzer-Avatar
Khemraj Sharma

Die Datenbindung muss nicht auf Nullwerte prüfen, sie wird von der Bindungsklasse behandelt.

Wenn Sie null für andere Zwecke (wie das Festlegen des Standardwerts) überprüfen müssen, können Sie dies so verwenden.

android:text="@{item.gender != null ? item.gender : @string/male}"

oder

android:text="@{item.gender ?? @string/male}"

Beide obigen Beispiele sind gleich. Hier @string/male ist Standardwert, wenn item.gender ist null.

Ich habe so etwas versucht.

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

  <data>
     <import type="android.text.TextUtils"/>
     <variable
        name="mOrder"
        type="com.test.app.models.Order" />
  </data>
  <TextView
    android:id="@+id/mLblSource"
    android:layout_width="100dp"
    android:layout_height="40dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:text="@{TextUtils.isEmpty(mOrder.order_id) ? "- -" : mOrder.order_id}"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toBottomOf="parent" />
</layout>

1142550cookie-checkDatenbindung: Eigenschaft festlegen, wenn sie nicht null ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy