2016-06-03 2 views
5

setOnPageChangeListener 용 핸들러를 Android Binding 기능이있는 XML 파일의 ViewPager에 바인딩 할 수 있습니까?ViewPager 용 안드로이드 이벤트 리스너 데이터 바인딩

데모는 onClick 이벤트를 보여 줍니 다만 얼마나 많은 이벤트 기능을 구현할 수 있는지 궁금합니다. 데이터 바인딩 기능에 대한 링크도 훌륭합니다. 감사.

가설 예 :

example_activity.xml

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

<data> 
    <variable name="handlers" type="com.example.Handlers"/> 
</data> 

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 

    android:onPageChangeListener="@{handlers.pageChanged}" /> 
</layout> 

Handler.java가

package com.example.viewmodels; 

import android.view.View; 

public class Handlers { 
    public void pageChanged(View view){} 
} 

컴파일 오류이다

오류 (6 2) 'android'패키지의 'onPageChangeListener'속성에 대한 자원 식별자가 없습니다.

답변

7

가능합니다. Android 지원 라이브러리의 View 클래스에 대해 미리 정의 된 BindingAdapter 클래스가 없으므로 사용자 정의 바인딩 어댑터를 구현해야합니다.

맞춤 어댑터 구현 방법은 this입니다.

코드는 다음과 같이해야한다, 나는 철저히 테스트하지 않았습니다 :

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:onPageChangeListener="@{handlers}" /> 

귀하의 BindingAapter 코드 :

@BindingAdapter("onPageChangeListener") 
public static void setOnPageChangeListener(ViewPager viewPager, ViewPager.OnPageChangeListener listener) { 
    Log.i("setOnPageChangeListener"); 

    // clear listeners first avoid adding duplicate listener upon calling notify update related code 
    viewPager.clearOnPageChangeListeners(); 
    viewPager.addOnPageChangeListener(listener); 
} 

P.S.을 전달되는 처리기 클래스는 ViewPager.OnPageChangeListener이어야합니다.

+1

좋지 않은 솔루션입니다. ViewPager는 내부 ArrayList에 OnPageChangeListener를 추가하기 때문에이 속성에 대한 notifyChange()를 호출하면 여러 리스너가 추가됩니다. – b1n0m

+0

@ b1n0m 리스너를 추가하기 전에 리스너를 먼저 제거하도록 업데이트되었습니다. –

3

여기가 궁극적 인 해결책입니다. 이 클래스를 프로젝트에 넣기 만하면됩니다.

리소스에 ID 리소스를 추가하십시오. 그런 다음

<resources> 
    <item name="page_change_listener" type="id"/> 
</resources> 

이 같은 XML에서 사용할 수있을 것입니다 :

<android.support.v4.view.ViewPager 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:currentPage="@={viewModel.currentPage}" 
       android:offscreenPageLimit="@{viewModel.offscreenPageLimit}" 
       android:onPageSelected="@{currentPage -> viewModel.pageSelected(currentPage)}" 
       android:adapter="@{adapter}"/> 

당신이 볼 수 있듯이, currentPage이 역 바인딩, 그래서 당신의 ViewModel 현재 얻을 또한 현재 페이지를 설정 할 수있다 사용자가 스 와이프하면 페이지가 나타납니다.

+0

이 뷰어에서 프래그먼트를 동적으로 업데이트 할 수 있습니까? 실시간? –

+0

@ azizi-musa,'viewModel.currentPage' 값을 설정하여 다른 페이지를 선택할 수 있습니다. 'ViewPager'에서 프래그먼트를 변경하려면'PagerAdapter'에서 이것을해야합니다. – b1n0m

관련 문제