2013-03-12 21 views
5

Sono davvero newbie in Android e gradirei qualsiasi aiuto per il mio lavoro di corso.ViewPager nidificato in ViewPager

ho bisogno di fare:

1) due ViewPagers (non annidata) in un'attività

2) due ViewPagers (uno ViewPager è annidato in un altro ViewPager)

ho trovato domanda simile, ma non potrei usarlo. ViewPager inside ViewPager

aggiungo prima ViewPager e non sanno che cosa fare dopo

LayoutInflater inflater = LayoutInflater.from(this); //this - context of my activity 
List<View> pages = new ArrayList<View>(); 
View page = inflater.inflate(R.layout.activity_main, null); 
//next I adding some buttons on page 
pages.add(page); 

page = inflater.inflate(R.layout.activity_main2, null); //my second page 
//some buttons 
pages.add(page); 

page = inflater.inflate(R.layout.activity_main3, null); //my third page 
//some buttons 
pages.add(page); 

SamplePagerAdapter pagerAdapter = new SamplePagerAdapter(pages); 
ViewPager viewPager = new ViewPager(this); 
viewPager.setAdapter(pagerAdapter); 
viewPager.setCurrentItem(0);   
setContentView(viewPager); 

Se aggiungo ViewPager2 e dire setContentView (viewPager2), ho perso il mio viewPager1. Ho passato un sacco di tempo per queste due domande, per favore, un po 'di aiuto ...

// Questo è il mio schizzo cosa devo fare. Siamo spiacenti, non riesco a collegare i miei scetches ...

+3

non mi aspetto "uno ViewPager è annidato in un altro ViewPager" di lavorare bene a tutti. – CommonsWare

+1

Controlla la mia risposta qui http://stackoverflow.com/a/25800572/2868352 –

+0

@CommonsWare, perché no? Tinder lo sta facendo, giusto? –

risposta

15

ho aggiunto un OnTouchListener all'interno ViewPager:

private OnTouchListener mSuppressInterceptListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(
       event.getAction() == MotionEvent.ACTION_DOWN && 
       v instanceof ViewGroup 
     ) { 
       ((ViewGroup) v).requestDisallowInterceptTouchEvent(true); 
     } 
     return false; 
    } 
}; 

Questo rileva solo gli eventi ACTION_DOWN touch sul interna ViewPager e impedisce quella esterna da intercettare esso. Poiché restituisce false, deve essere colpito solo l'evento ACTION_DOWN; tutti gli altri eventi saranno ignorati. Puoi aggiungere questo listener a tutti gli elementi che desideri "proteggere" dallo scrolling esterno dello ViewPager, anche se ovviamente se vuoi cogliere qualsiasi altro comportamento tattile su quegli elementi devi occupartene all'interno dell'ascoltatore touch e possibilmente implementare un ascoltatore migliore.

+1

Grazie macloving questo aiutami a !! –

+0

Blocca il genitore dallo scorrimento. Tuttavia, ho ancora bisogno che lo spazio nidifichi per scorrere. – StarWind0

1

Penso che dovresti riconsiderare l'idea di avere un viewpager all'interno di un altro viewpager. Avrai molti problemi con gli eventi touch e l'esperienza utente potrebbe essere confusa/complicata, ti suggerisco di ripensare a quello.

Ora per la domanda 1:

Dichiarare entrambi viewpagers nel file XML delle attività (/layout/activity.xml), ad esempio:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v4.view.ViewPager 
      android:id="@+id/viewpager1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 

    <android.support.v4.view.ViewPager 
      android:id="@+id/viewpager2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 

</LinearLayout> 

Poi gonfiare il xml sul metodo onCreate della vostra attività e filo di entrambe le viewpagers:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity); 

    mViewpager1 = (ViewPager) findViewById(R.id.viewpager1); 
    mViewpager2 = (ViewPager) findViewById(R.id.viewpager2); 
} 

non dimenticare di dichiarare le due variabili private ViewPager mViewpager1, mViewpager2;

012.

Quindi puoi fare tutto ciò che vuoi con mViewpager1 e mViewpager2. Un altro consiglio, ti suggerisco di usare gli adattatori per impostare le pagine invece di aggiungerle manualmente una per una a ciascun viewpager, sarà molto più pulito e con cui operare meglio.

0

Una soluzione di avere un Viewpager nidificato e disattivando il Viewpager annidati strisciata (se si desidera impostare le pagine selezionate con i tasti del nidificato)

Per la nidificato È SubClass ViewPager e si aggiungono questi:

public boolean onInterceptTouchEvent(MotionEvent event) { 
     //if you want to send the Touches to this Viewpager (the nested) //change true to false 
     return true;  
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // Never allow swiping to switch between pages on this inner 

     //send swipe to father instead of child 
     if (this.getParent()!=null && this.getParent() instanceof ViewPager) { 
      ((ViewPager) this.getParent()).onTouchEvent(event); 
     } 
     return false; 
    } 

negli schemi mettere questo:

<com.mypackage.mycustomapp.myviews.MyViewPager 
      android:id="@+id/myNestedviewpager" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/>