Android` @ BindingAdapter` setter未被调用

时间:2016-11-05 20:01:07

标签: android android-layout

这是我的BindingAdapter

public class Bindings{
    @BindingAdapter({"font"})
    public static void setFont(TextView textView, String fontName) {
        textView.setTypeface(FontCache.getInstance(textView.getContext()).get(fontName));
    }
}

*而不是使用" font"作为注释参数,我试过" bind:font"," android:font"和" app:font",并做了所有相应的布局中的更改,但仍未调用BindingAdapter

这是我使用BindingAdapter(bind_layout.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></data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@null"
            font="@{`fontawesome-webfront`}"
            android:text="@string/double_left"/>
    </LinearLayout>
</layout>

*此布局包含在使用DatabindingUtils.setContentView

设置的活动布局中

这是布局包含bind_layout.xml的活动:

public class ACreateSemester extends AppCompatActivity {
    private List<CreateItemView> mCreateItemViews;
    private LinearLayout mItemContainer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DataBindingUtil.setContentView(this,R.layout.a_create_items);
        mItemContainer = (LinearLayout) findViewById(R.id.item_container);
        mItemContainer.addView(new CreateItemView(this, Item.getDefaultItem()));
    }

}

我在这里引用的三个文件全部列出。

我知道BindingAdapter未被调用的方式是因为我在方法和正文中设置断点,并且永远不会达到断点。

知道为什么BindingAdapter没有被解雇?

2 个答案:

答案 0 :(得分:1)

我认为你错过了将你的观点与活动中的viewModel联系起来。

public class ACreateSemester extends AppCompatActivity {
private List<CreateItemView> mCreateItemViews;
private LinearLayout mItemContainer;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ACreateItemsBinding binding =  DataBindingUtil.setContentView(this,R.layout.a_create_items);
    mItemContainer = (LinearLayout) findViewById(R.id.item_container);
    mItemContainer.addView(new  CreateItemView(this,Item.getDefaultItem()));
    binding.setView(YourViewHere);
}

答案 1 :(得分:1)

请确保您已执行此步骤。

  1. 在应用程序级别build.gradle中应用插件:“ kotlin-kapt”。
  2. 将生命周期所有者设置为通过您活动的onCreate()方法进行绑定,例如     binding.lifecycleOwner = this,这是您的活动。
  3. 将font =“ @ {{fontawesome-webfront}”更改为app:font =“ @ {fontawesome-webfront}” 在您的xml中。
  4. 在xml布局中向按钮添加一些ID。