2016-11-03 16 views
0

データバインディングを初めて使用しました。バインディングクラスのinflate()を使用しているとAndroidデータバインディングが機能しません

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <data> 
     <variable name="userProfile" type="com.demo.entity.UserProfile"/> 
    </data> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="16dp"> 
     <TextView 
      android:id="@+id/username_tv" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:textSize="20sp" 
      android:textStyle="bold" 
      android:text="@{userProfile.username}" /> 
    </RelativeLayout> 
</layout> 

私はhere与えられた文書の第二の方法に従ってアンドロイドにデータバインディングを使用しようとしている:私は以下のようにレイアウトファイルを持っています。私は抽象クラスのDrawerLayoutの一部であるフレームレイアウトに関連するレイアウトを展開しているので、最初のメソッドを使用していません。同じナビゲーションドロワーを複数のアクティビティで使用することができます[に]。

そこで私のコードは次のようになります。

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    inflateActivityViewInFrame(R.layout.activity_profile, R.string.action_profile); 
    initialiseData(); 
} 

private void initialiseData() { 
    ActivityProfileBinding binding = ActivityProfileBinding.inflate(getLayoutInflater()); 
    UserProfile userProfile = new UserProfile("Croaking Tiger Riding Dragon", 8, 16, 32); 
    binding.setUserProfile(userProfile); 
} 

親クラスのinflateActivityViewInFrame()メソッドは、これだけん:

protected void inflateActivityViewInFrame(int layoutId, int titleStringId) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(layoutId, mFrameLayout, false); 
    mFrameLayout.addView(view); 

    setupActionBarAndDrawerToggle(titleStringId); 
} 

コードは罰金コンパイルし、何のログメッセージは、のいずれかではありませんランタイム。 エンティティクラスは、(すべてのプロパティの公開ゲッターが続く)

public class UserProfile { 
    private final String username; 
    private final int numContributions; 
    private final int numBookmarks; 
    private final int numLikes; 

    public UserProfile(String username, int numContributions, int numLikes, int numBookmarks) { 
     this.username = username; 
     this.numContributions = numContributions; 
     this.numBookmarks = numBookmarks; 
     this.numLikes = numLikes; 
    } 

これが機能しない理由の任意の考えですか?

+0

あなたのフィールドがプライベートなので、 – Beloo

+0

@Belooすべてのフィールドはパブリックゲッターを持っています...申し訳ありませんが、それを短く保つためにコードを添付しませんでした:)私は質問で言及したようです:) –

+0

ちょうど、また、バインドされたデータの代わりに定数の文字列が使用されているときに表示されています。 –

答えて

1

inflateActivityViewInFrameでレイアウトを膨らませてから、もう一度膨らませて(取り付けていない)、initialiseDataにしているという問題があります。あなたはどちらか一方を選択することができます。この次のいずれか、その後

protected <T extends ViewDataBinding> T inflateActivityViewInFrame(
     int layoutId, int titleStringId) { 
    LayoutInflater inflater = (LayoutInflater) 
     getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    T binding = DataBindingUtil.inflate(inflater, layoutId, mFrameLayout, true); 
    setupActionBarAndDrawerToggle(titleStringId); 
} 

およびデータセットへの戻りViewDataBindingを使用します。

ActivityProfileBinding binding = 
    inflateActivityViewInFrame(R.layout.activity_profile, R.string.action_profile); 
UserProfile userProfile = new UserProfile("Croaking Tiger Riding Dragon", 8, 16, 32); 
binding.setUserProfile(userProfile); 

それとも、あなただけの既に膨張したレイアウトをバインドすることができます。

protected View inflateActivityViewInFrame(int layoutId, int titleStringId) { 
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(layoutId, mFrameLayout, false); 
    mFrameLayout.addView(view); 

    setupActionBarAndDrawerToggle(titleStringId); 
    return view; 
} 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View view = inflateActivityViewInFrame(
     R.layout.activity_profile, R.string.action_profile); 
    initialiseData(view); 
} 

private void initialiseData(View view) { 
    ActivityProfileBinding binding = ActivityProfileBinding.bind(view); 
    UserProfile userProfile = new UserProfile("Croaking Tiger Riding Dragon", 8, 16, 32); 
    binding.setUserProfile(userProfile); 
} 

可能な限りインフレーションに近いバインディングを可能にするので、私は後者を常に優先します。

+0

デベロッパーガイドから、このAPIが存在していたことがわかりませんでした。 –

関連する問題