2013-05-03 33 views
25

Tôi mới dùng Viewpager và sau khi đọc http://developer.android.com/reference/android/support/v4/view/ViewPager.html từ google, tôi dường như không tìm thấy bất kỳ điều gì có liên quan trên viewPager.setOnItemClickListener(new OnItemClickListener() { Chúng tôi có các tùy chọn khác để hoạt động như Mục được nhấp không?ViewPager OnItemClickListener

Testing ra

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

     }); 

Lỗi: Phương pháp setOnItemClickListener (AdapterView.OnItemClickListener mới() {}) là undefined cho các loại ViewPager

+0

Để thiết lập ViewPager với các tab tham khảo http://www.gadgetsaint.com/android/create- viewpager-tabs-android/#. WPuppVN97BI – ASP

Trả lời

63

Không có phương pháp gọi lại OnItemClick cho ViewPager. Nếu bạn muốn nhấp vào các sự kiện trên mỗi trang thì bạn sẽ phải xây dựng người nghe của bạn vào nội dung trang trong Bộ điều hợp của bạn.

một cái gì đó như thế này:

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

chính xác những gì bạn cần sẽ phụ thuộc một chút về những gì khác mà bạn đang làm bên trong instantiateItem() mà bạn đã không được đăng vì vậy tôi không thể cung cấp cho bạn một câu trả lời cụ thể hơn.

+0

Chúng ta có thể lấy vị trí ra khỏi OnClick không? –

+0

@DroidBeginner nếu theo vị trí bạn muốn nói x/y thì bạn sẽ phải sử dụng OnTouchListener() thay vì onClick và lấy x/y ra khỏi MotionEvent được chuyển tới phương thức onTouch(). Nếu bạn có nghĩa là vị trí như trong trang mà người dùng đã sử dụng thì sử dụng tham số 'int pos' đang được chuyển đến mục khởi tạo. Tôi sẽ chỉnh sửa câu trả lời của tôi để bao gồm câu trả lời sau. – FoamyGuy

+2

Bạn đã hướng dẫn tôi đi đúng hướng. Tôi đặt 'onClickListener' vào' View' đã được trả về trong 'onCreateView()' của Fragment. – Sufian

1

Tôi không chắc chắn những gì bạn mong đợi sẽ phản hồi với bạn với người nghe ở trên.

Có một setOnClickListener(View.OnClickListener l) mà bạn có thể sử dụng để phát hiện một liên lạc với viewPager.

Bạn cũng có thể sử dụng onPageScrolled để nhận thông tin nhập của người dùng và onPageSelectedonTabSelected.

@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

Bạn đặt onPageSelected ở đâu? Trong bộ điều hợp chế độ xem hoặc lớp chính? –

+0

Bạn sẽ làm điều đó trong bộ điều hợp (do đó bạn đã overried-- bạn đang ghi đè phiên bản mặc định của phương thức đó với bất kỳ điều gì bạn muốn làm) – HalR

+0

Không ai trong số những người nghe này cung cấp khả năng phát hiện nhấp chuột trên trang hiện tại – JamisonMan111

23

tôi thực hiện tùy chỉnh 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; 
     } 
    } 
} 

Và mã để thực hiện onItemClickListener

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

Nó làm việc cho tôi. Cảm ơn :) – Aakanksha

+0

@Aakanksha Không vấn đề gì) –

+0

sự kiện chạm không gọi trên máy nhắn tin xem của tôi. – james