2016-08-30 7 views
8

Android UI ToolkitチームのYigit BoyarとGeorge Mountメンバーはtalk on databindingでした。ビデオの13:41にGeorge Mountがこう言っています。データバインディング:リスナーから複数のメソッドを使用して単一のメソッドをバインドします

また、onTextChangedのような奇妙なリスナーを行うこともできます。 TextWatcherには3つのメソッドがありますが、誰もが onTextChangedだけ気にします。 が必要な場合は、実際にそのうちの1つにしかアクセスできません。

<Button android:onTextChanged="@{handlers.textChanged}" …/> 

彼は、代わりにこの

editText.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
     //Do something 
    } 

    @Override 
    public void afterTextChanged(Editable editable) {} 
}); 

ようになり、通常addTextChangedListener方法を使用しての我々は単にこの

<EditText 
    android:onTextChanged="@{handlers::onTextChanged}" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

ハンドラクラスを行うことができると言っているように見えました

コードはこのインスタンスでは機能しますが、リスナーにViewPagerのaddOnPageChangeListenerメソッドのような複数のメソッドがある場合は動作しないようです。たとえば、これは

<android.support.v4.view.ViewPager 
    android:OnPageSelected="@{handlers::onPageSelected}" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

とハンドラクラスは動作しません

public class Handlers{ 
    public void onPageSelected(int position) { 
     //Do something 
    } 
} 

プロジェクトは、私は今ので少し混乱してい

Error:Execution failed for task ':app:compileDebugJavaWithJavac'. 
> java.lang.RuntimeException: Found data binding errors. 
****/ data binding error ****msg:Could not resolve handlers::onPageSelected as a listener. 

****\ data binding error **** 

を構築しようとしているこのエラーを吐きますEditTextは実際に継承されたonTextChangedメソッドを持ち、データバインディングライブラリはandroid:onTextChanged="@{handlers::onTextChanged}"にバインドすることもできます。

私の質問は、実際には1つのリスナーメソッドにバインドすることが可能で、何かが欠落しているか、ジョージマウントさんが彼の話に間違いを感じましたか?

答えて

9

だが、それは我々がViewPagerのためにそれを実装していないように見えます:-)

話に間違いはなかったことを期待しましょう。実装はあまり難しくありません。トリックがあります。マッチングするメソッドごとに1つのインタフェースを宣言する必要があります。

public interface OnPageScrollStateChanged { 
    void onPageScrollStateChanged(int state); 
} 
public interface OnPageScrolled { 
    void onPageScrolled(int position, float offset, int offsetPixels); 
} 
public interface OnPageSelected { 
    void onPageSelected(int position); 
} 

その後、結合アダプターは、イベントのために作成する必要があります。

@BindingAdapter(value = {"android:onPageScrollStateChanged", 
         "android:onPageScrolled", 
         "android:onPageSelected"}, requireAll=false) 
public static void setViewPagerListeners(ViewPager view, 
     final OnPageScrollStateChanged scrollStateChanged, 
     final OnPageScrolled scrolled, 
     final OnPageSelected selected) { 
    OnPageChangeListener newListener = null; 
    if (scrollStateChanged != null || scrolled != null || selected != null) { 
     newListener = new OnPageChangeListener() { 
      @Override 
      public void onPageScrollStateChanged(int state) { 
       if (scrollStateChanged != null) { 
        scrollStateChanged.onPageScrollStateChanged(state); 
       } 
      } 
      // similar with the other two methods ... 
     }; 
    } 

    OnPageChangeListener oldListener = ListenerUtil.trackListener(view, 
     newListener, R.id.viewPagerListener); 
    if (oldListener != null) { 
     view.removeOnPageChangeListener(oldListener); 
    } 
    if (newListener != null) { 
     view.addOnPageChangeListener(newListener); 
    } 
} 
+0

すごいです!馬の口からまっすぐ答えてください:) – Olumide

関連する問題