2013-05-03 18 views
25

Jestem nowy w Viewpager, a po przeczytaniu http://developer.android.com/reference/android/support/v4/view/ViewPager.html z google, nie mogę znaleźć niczego podobnego na viewPager.setOnItemClickListener(new OnItemClickListener() { Czy mamy inne opcje działania jako kliknięcie elementu?ViewPager OnItemClickListener

testowania

viewPager.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       Intent i = new Intent(MainActivity.this, SingleItemView.class); 
       i.putExtra("flag", flag); 
       i.putExtra("position", position); 
       startActivity(i); 
      } 

     }); 

błędu: Sposób setOnItemClickListener (New AdapterView.OnItemClickListener() {}) jest zdefiniowana dla typu ViewPager

+0

Aby skonfigurować viewpager z kartami odnoszą http://www.gadgetsaint.com/android/create- viewpager-tabs-android/#. WPuppVN97BI – ASP

Odpowiedz

63

Nie ma OnItemClick sposób wywołania zwrotnego do ViewPager. Jeśli chcesz kliknąć zdarzenia na każdej stronie, musisz zbudować słuchacza w treści strony w swoim adapterze.

coś takiego:

@Override 
public Object instantiateItem(View collection, final int pos) { //have to make final so we can see it inside of onClick() 
    LayoutInflater inflater = (LayoutInflater) collection.getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


    View page = inflater.inflate(R.layout.YOUR_PAGE, null); 

    page.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v){ 
      //this will log the page number that was click 
      Log.i("TAG", "This page was clicked: " + pos); 
     } 
    }); 


    ((ViewPager) collection).addView(page, 0); 
    return page; 
} 

dokładnie to, co trzeba będzie zależeć trochę o tym, co robisz wewnątrz instantiateItem(), które nie zostały jeszcze zaksięgowane więc nie mogę dać bardziej konkretnej odpowiedzi.

+0

Czy możemy uzyskać pozycję poza OnClick? –

+0

@DroidBeginner jeśli przez pozycję masz na myśli x/y, musisz użyć OnTouchListener() zamiast onClick i uzyskać x/y z MotionEvent, który zostanie przekazany do metody onTouch(). Jeśli masz na myśli pozycję na jakiej stronie był użytkownik, użyj po prostu parametru 'int pos', który jest przekazywany do instancji. Zmienię moją odpowiedź na tę drugą. – FoamyGuy

+2

Poprowadziłeś mnie we właściwym kierunku. Wstawiłem 'onClickListener' na' Widok', który był zwracany w 'onCreateView() mojego fragmentu'. – Sufian

1

Nie jestem pewien, czego oczekiwałbyś, aby odpowiedzieć na ciebie z powyższym słuchaczem.

Istnieje setOnClickListener(View.OnClickListener l), którego można użyć do wykrycia dotyku do widoku viewPager.

Można również użyć onPageScrolled, aby uzyskać dane wejściowe użytkownika, oraz onPageSelected i onTabSelected.

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
} 

@Override 
public void onPageSelected(int position) { 
    mActionBar.setSelectedNavigationItem(position); 
} 

@Override 
public void onPageScrollStateChanged(int state) { 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    Object tag = tab.getTag(); 
    for (int i=0; i<mTabs.size(); i++) { 
     if (mTabs.get(i) == tag) { 
      mViewPager.setCurrentItem(i); 
     } 
    } 
} 
+0

Gdzie umieścisz onPageSelected? W adapterze strony głównej lub głównej klasie? –

+0

Zrobiłbyś to w adapterze (stąd wykupione - nadpisujesz domyślną wersję tej metody i cokolwiek chcesz zrobić). – HalR

+0

Żaden z tych detektorów nie zapewnia możliwości wykrycia kliknięcia na bieżącej stronie – JamisonMan111

23

I wdrożone zwyczaj ViewPager:

public class ClickableViewPager extends ViewPager { 

    private OnItemClickListener mOnItemClickListener; 

    public ClickableViewPager(Context context) { 
     super(context); 
     setup(); 
    } 

    public ClickableViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setup(); 
    } 

    private void setup() { 
     final GestureDetector tapGestureDetector = new GestureDetector(getContext(), new TapGestureListener()); 

     setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       tapGestureDetector.onTouchEvent(event); 
       return false; 
      } 
     }); 
    } 

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 
     mOnItemClickListener = onItemClickListener; 
    } 

    public interface OnItemClickListener { 
     void onItemClick(int position); 
    } 

    private class TapGestureListener extends GestureDetector.SimpleOnGestureListener { 

     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      if(mOnItemClickListener != null) { 
       mOnItemClickListener.onItemClick(getCurrentItem()); 
      } 
      return true; 
     } 
    } 
} 

i kod do wdrożenia onItemClickListener

ClickableViewPager viewPager = (ClickableViewPager) findViewById(R.id.viewPager); 
viewPager.setOnItemClickListener(new ClickableViewPager.OnItemClickListener() { 
      @Override 
      public void onItemClick(int position) { 
       // your code 
      } 
     }); 
+0

To zadziałało dla mnie. Dzięki :) – Aakanksha

+0

@Aakanksha Bez problemu) –

+0

Zdarzenie dotykowe nie jest wywoływane na moim pager widoku. – james