6

Lisa Wray の投稿TextViewで説明されているように、カスタム フォントを 1 行で適用しようとしています。は、に入るアイテムの一部ですTextViewRecyclerView

最上位のビルド ファイルにデータ バインディングの依存関係を追加しました。

classpath 'com.android.tools.build:gradle:1.3.0'
classpath "com.android.databinding:dataBinder:1.0-rc1"

メイン モジュールにもプラグインを適用しました。

apply plugin: 'com.android.application'
apply plugin: 'com.android.databinding'

item.xmlに追加されるファイルは次のとおりですRecyclerView

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

    <data></data>

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:layout_width="100dp"
        android:layout_height="130dp"
        android:layout_gravity="center"
        card_view:cardCornerRadius="2dp">

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

            <ImageView
                android:id="@+id/image"
                android:layout_width="match_parent"
                android:layout_height="100dp"/>

            <TextView
                android:id="@+id/name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:font="@{@string/font_yekan}"/>

        </LinearLayout>
    </android.support.v7.widget.CardView>
</layout>

layoutルート要素を追加app:font="@{@string/font_yekan}"し、静的セッター メソッドと組み合わせました。

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName) {
    textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

トリックを行う必要があります。しかし、プログラムを実行しても、フォントは変更されません。ただし、上記の静的メソッドを削除すると、次のエラーが発生します。

パラメータ タイプが java.lang.String の属性 'app:font' のセッターが見つかりません。

そのため、データ バインディング フレームワークはバインディングを認識しましたが、セッター メソッドは呼び出されません (ログは出力を出力しません)。

ここで何が問題なのですか?

4

2 に答える 2

6

以下を想定して、上記のレイアウトとセットアップを提供します。

アダプター内RecyclerViewで、次のいずれかの方法でビューをバインドしました。

  1. アダプタ クラスの onCreateViewHolder メソッド内

    @Override
    public MyAdapter.MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.recycler_item,
                parent, false);
        return new MyHolder(binding.getRoot());
    }
    
  2. またはその onBindViewHolder メソッドで

        @Override
        public void onBindViewHolder(MyAdapter.MyHolder holder, int position) {
            DataBindingUtil.bind(holder.itemView);
            //...
        }
    

次のリソース設定

アセット フォルダーは次のようになります。

資産フォルダー

文字列リソース ファイルには、フォントの完全修飾名が必要です。

<string name="kenyan">kenyan_rg.ttf</string>

これが保証されれば、うまくいくはずです(そして私にとってはうまくいきます)

于 2015-09-14T15:50:52.077 に答える