2016-08-30 5 views
8

एंड्रॉइड यूआई टूलकिट टीम के यिजिट बॉयर और जॉर्ज माउंट सदस्यों ने talk on databinding दिया। 13:41 पर जॉर्ज माउंट का कहना है किडाटाबेसिंग: एकाधिक विधियों के साथ श्रोता से एकल विधि

आप कुछ अजीब श्रोताओं को भी कर सकते हैं, जैसेTextChanged। टेक्स्टवॉचर के पास तीन विधियां हैं, लेकिन सभी को केवल पर टेक्स्ट चेंज किया गया है, है ना? यदि आप चाहते हैं, या उन सभी में आप वास्तव में उनमें से केवल एक तक पहुंच सकते हैं। "

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

वह लग रहा था कह जा सकता है कि बजाय हमेशा की तरह addTextChangedListener विधि है कि इस

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

तरह दिखता है का उपयोग कर के हम बस यह

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

हैंडलर वर्ग कर सकता है

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

कोड इस उदाहरण में काम करता है, लेकिन यह अन्य मामलों में काम नहीं करता है जहां श्रोता के पास 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 **** 

निर्माण करने के लिए मैं अब क्योंकि थोड़ा संदेह में हूँ कोशिश कर इस त्रुटि बाहर थूक यह पता चला है कि एडिटटेक्स्ट में वास्तव में विरासत में onTextChanged विधि है जो डाटाबेसिंग लाइब्रेरी android:onTextChanged="@{handlers::onTextChanged}" को भी बांध सकती है।

तो मेरा सवाल यह है कि वास्तव में एक श्रोता विधि से जुड़ना संभव है और मुझे कुछ याद आ रहा है, या जॉर्ज माउंट ने अपनी बातचीत में गलती की है?

उत्तर

9

आइए आशा व्यक्त की कि यह बात में कोई गलती नहीं था :-)

ऐसा लगता है कि हम ViewPager के लिए इसे लागू नहीं किया। कार्यान्वयन बहुत मुश्किल नहीं है। एक चाल है - आपको प्रत्येक मिलान विधि के लिए एक इंटरफ़ेस घोषित करना होगा।

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

संबंधित मुद्दे