2016-08-30 14 views
8

Yigit Boyar và George Mount thành viên của nhóm bộ công cụ giao diện người dùng Android đã cho một talk on databinding. Trong video tại 13:41 George Mount nói điều nàyDatabinding: Bind phương pháp duy nhất từ ​​người nghe với nhiều phương pháp

Bạn cũng có thể thực hiện một số người nghe kỳ lạ, như onTextChanged. TextWatcher có ba phương pháp trên đó, nhưng mọi người chỉ quan tâm đến onTextChanged, phải không? Bạn thực sự có thể truy cập chỉ một trong số họ nếu bạn muốn hoặc tất cả chúng. "

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

Ông dường như nói rằng thay vì sử dụng addTextChangedListener phương pháp thông thường mà trông giống như sau

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) {} 
}); 

chúng tôi chỉ có thể làm lớp

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

Handlers này

public class Handlers{ 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     //Do something 
    } 
} 

Mã hoạt động trong trường hợp này, nhưng nó dường như không hoạt động trong các trường hợp khác mà người nghe có nhiều phương pháp như phương pháp addOnPageChangeListener của ViewPager. Ví dụ này không làm việc

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

và lớp Handlers

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

Dự án spits ra lỗi này khi cố gắng xây dựng

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 **** 

Tôi là một chút bối rối bây giờ bởi vì nó chỉ ra rằng EditText thực sự có một phương pháp onTextChanged được thừa hưởng mà thư viện dữ liệu cũng có thể ràng buộc android:onTextChanged="@{handlers::onTextChanged}". Vì vậy, câu hỏi của tôi là nó thực sự có thể ràng buộc với một phương pháp nghe duy nhất và tôi đang thiếu một cái gì đó, hoặc George Mount đã làm cho một sai lầm trong cuộc nói chuyện của mình?

Trả lời

9

Hãy hy vọng rằng nó không phải là một sai lầm trong cuộc nói chuyện :-)

Dường như chúng tôi đã không thực hiện nó cho ViewPager. Việc triển khai không quá khó. Có một thủ thuật - bạn phải khai báo một giao diện duy nhất cho mỗi phương thức phù hợp.

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); 
} 

Sau đó adapter ràng buộc nên được tạo ra cho các sự kiện:

@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

Awesome! Trả lời thẳng từ miệng ngựa :) – Olumide

Các vấn đề liên quan