2016-06-03 50 views
5

SetOnPageChangeListener için bir işleyiciyi, Android Binding işlevine sahip XML dosyasındaki bir ViewPager'a bağlamak mümkün mü?Android Olay Dinleyicisi ViewPager için Veri Bağlama

DemolarClick olaylarını gösterir ancak bununla ne kadar etkinlik işlevselliği uygulayabileceğimi merak ediyorum. Veri Bağlama yetenekleri ile ilgili herhangi bir bağlantı da harika olacaktır. Teşekkürler.

Varsayımsal örnek:

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

derleme hatasıdır:

hata: (6 2) 'android'

cevap

7

'onPageChangeListener' özniteliği için hiçbir kaynak tanımlayıcısı bulunamadı. Bunu yapmak mümkündür. Android destek kitaplıklarından View sınıfları için önceden tanımlanmış BindingAdapter sınıfları olmadığından özel bir bağlama bağdaştırıcısı uygulamanız gerekir.

Özel bağdaştırıcıyı nasıl uygulayacağınız konusunda this.

Aşağıdaki kod gibi bir şey olmalıdır, ben iyice test etmedim:

<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}" /> 

Sizin BindingAapter kodu:

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

dip not Geçirilen işleyici sınıfınız ViewPager.OnPageChangeListener'u uygulamalıdır.

+1

İyi bir çözüm değil. ViewPager, iç ArrayList'e OnPageChangeListener eklediğinden, notifyChange() özelliği bu özellik için birkaç dinleyici eklemesini sağlar. – b1n0m

+0

@ b1n0m, dinleyici eklemeden önce dinleyicileri kaldırmak için güncellendi –

3

İşte en mükemmel çözüm. Bu sınıfı projenize koymanız yeterli. Ayrıca kaynaklarınıza kimlik kaynağı ekleyin. Sonra

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

sizin gibi xml kullanmak mümkün olacak:

<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}"/> 

Gördüğünüz gibi, currentPage ters bağlama, böylece ViewModel akımı almak da geçerli sayfayı ayarlamak ve mümkün olacak etmiştir kullanıcı kullanıcı soyarsa sayfa.

+0

Bu ayar, dinamik olarak görüntüyü dinamik olarak güncelleyebilir mi? gerçek zamanda? –

+0

@ azizi-musa, başka bir sayfa seçmek için viewModel.currentPage değerini ayarlayabilirsiniz. Parçaları ViewPager'da değiştirmek isterseniz, bunu "PagerAdapter" içinde yapmalısınız. – b1n0m