9

Sto utilizzando il Navigatore nella mia app, che contiene alcuni frammenti proprio come nell'immagine qui sotto.2 ViewPager non sta scorrendo su Android 2.3

enter image description here

Ogni frammento contiene un altro ViewPager che è un ImageSlider, e al di sotto che è un Listview e nella parte superiore Sto usando la SwipeRefreshLayout. Il mio problema è che il dispositivo di scorrimento delle immagini funziona bene su dispositivi con Android versione 3.0 o successiva, ma lo scorrimento verso sinistra o verso destra non funziona sui dispositivi 2.3 e precedenti, invece richiama lo scorrimento del Parent ViewPager che naviga nel frammento. Sto usando la libreria di supporto Versione 4 per questo scopo per supportare dispositivi inferiori a 3.0. Tutte le funzioni funzionano abbastanza bene su 2.3 dispositivi tranne quello. L'ho cercato su google ma non ho trovato aiuto da nessuna parte. Quindi, per far scorrere ciò che dovrei fare per questo, ogni idea/aiuto sarà molto apprezzata.

+2

mettere il codice !! – Techfist

+0

Conosco quell'errore. Hai lo stesso problema se usi un 'HorizontalScrollView' o un' RecyclerView'. In generale, la funzionalità è ancora presente se scorri rapidamente di quanto non puoi scorrere. – rekire

+0

Perché sto usando il layout di swipeRefresh in modo da richiamare questo metodo. –

risposta

1

È possibile utilizzare questo ViewPager come genitore ViewPager. Ciò consente al bambino di scorrere ViewPager.

public class CustomViewPager extends ViewPager { 

    public CustomViewPager(Context context) { 
     super(context); 
    } 


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


    @Override 
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) { 
     try { 
      //Handle the issue only in lower versions of android 
      if (v != this && v instanceof ViewPager && CJRAppCommonUtility.getOSVersion() < android.os.Build.VERSION_CODES.HONEYCOMB) { 
       ViewPager viewPager = (ViewPager) v; 
       int currentPage = viewPager.getCurrentItem(); 
       int size = viewPager.getAdapter().getCount(); 
       //if ViewPager has reached its end and if user tries to swipe left allow the parent to scroll 
       if (currentPage == (size - 1) && dx < 0) { 
        return false; 
       } 
       //if ViewPager has reached its start and if user tries to swipe right allow the parent to scroll 
       else if (currentPage == 0 && dx > 0) { 
        return false; 
       } 
       //Allow the child to scroll hence blocking parent scroll 
       else { 
        return true; 
       } 
      } 
      return super.canScroll(v, checkV, dx, x, y); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
} 

sviluppatori di Android sito ha una bella spiegazione sulla gestione degli eventi di tocco in un Viewgroup. È possibile fare riferimento qui: http://developer.android.com/training/gestures/viewgroup.html

Spero che aiuti !!

0

Nella versione precedente di Android richiestaDisallowInterceptTouchEvent non funziona così bene. La soluzione qui è di estendere la visualizzazione del cercapersone e sovrascrivere l'onInterceptTouchEvent e memorizzare un elenco di figli che sono scorrevoli. Quindi, quando viene chiamato onInterceptTouchEvent, è possibile scorrere l'elenco di bambini scrollabili, ottenere il rect di successo e verificare se l'evento di tocco si trova all'interno del rect di successo. Se lo è, puoi semplicemente restituire false per non gestirlo e lasciare che sia il bambino a prenderlo.

Qualcosa di simile a questo:

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    for (View view : scrollableChildren) 
    { 
     // get the hit rectangle for the view 
     Rect rect = new Rect(); 
     view.getHitRect(rect); 

     // check to see if the click was inside this child 
     if (rect.contains((int) ev.getX(), (int) ev.getY())) 
     { 
      return false; 
     } 
    } 

    return super.onInterceptTouchEvent(ev); 
}