1

Androidデータバインディングライブラリを使用して問題が発生しました。

xml は次のとおりです。

<?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="com.test.app.ObservableFieldWrapper"/>
    <variable
        name="org"
        type="ObservableFieldWrapper"/>
</data>
<LinearLayout
    android:id="@+id/headerListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">      
    <com.test.app.NSpinner
        android:id="@+id/orgSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:org="@{org.getSilent ? org.content : &quot;silent&quot;}"/>
</LinearLayout>

ここに私の NSpinner があります:

 public class ObservableFieldWrapper{

    private final ObservableBoolean silent;

    private final ObservableField<String> content;

    @BindingAdapter("org")
    public static void setOrg(Spinner view, String org) {
        assert org != null;
        if (org.equals("silent")) {
           Log.i("ObsWrapper", "SET ORG called via binding adapter but got denied, because of SILENCE");
            } else {
                Log.i("ObsWrapper", "SET ORG called via binding adapter NORMALLY");
                view.setSelection(Cache.GetOrgIndexForSpinner(), true);
            }
    }

    public ObservableFieldWrapper(String startValue) {
        content = new ObservableField<>(startValue);
        silent = new ObservableBoolean();
        silent.set(false);
    }

    public void setContent(String newValue) {
        silent.set(false);
        content.set(newValue);
        content.notifyChange();
    }

    public void setContentSilent(String newValue) {
        silent.set(true);
        content.set(newValue);
    }

  //Bunch of getters
}

そして、この呼び出しは、ObservableFieldWrapper クラスによって提供される静的ゲッターを呼び出す必要があります (すべてのバインディングが既に設定されていると仮定します)。

ObservableFieldWrapper someField = new ObservableFieldWrapper("someString");
someField.setContent("some other string");

さて、問題は...何も呼び出さないことです。しかし、xml部分を次から変更すると

app:org="@{org.getSilent ? org.content : &quot;silent&quot;}"

共通に

app:org="@{org.content}"

それは働き始めます!ブール値を使用したこの追加機能が本当に必要であり、問​​題を見つけようとして本当に迷っています。


xml 式でロジックを使用しない回避策を見つけました。関数に 2 つのパラメーターを渡して、そこですべての作業を行いました。

@Bindable ("{org, silent}")

しかし、この問題は未解決のままです。

4

1 に答える 1

0

ジョージ・マウントが述べたように、観測可能なフィールドのゲッターを削除することが重要です。そうしないと機能しません。この問題にかなりの時間を費やし、ゲッターを削除した後、すべてが機能し始めました。

于 2015-12-11T19:05:57.600 に答える