2011-12-12 11 views
6

Voglio creare una vista a scorrimento usando Horizontal View Pager. La vista sinistra deve avere la larghezza dello schermo intero, ma solo un quarto di larghezza (sarà un pannello verticale come nel browser Dolphin). È possibile farlo? Ho modificato android:layout_width nel layout corretto, ma non ha funzionato.Android diverse larghezze di layout in ViewPager

Il mio codice:

public class TestActivity extends FragmentActivity { 

@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_view); 

    MyPagerAdapter adapter = new MyPagerAdapter(); 
    ViewPager pager = (ViewPager) findViewById(R.id.panelPager); 
    pager.setAdapter(adapter); 
    pager.setCurrentItem(0); 
    } 
} 

main_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

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

MyPagerAdapter.java

public class MyPagerAdapter extends PagerAdapter { 

@Override 
public int getCount() { 
    return 2; 
} 

@Override 
public Object instantiateItem(final View collection, final int position) { 

    LayoutInflater inflater = 
      (LayoutInflater) collection.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    int resId = 0; 
    switch (position) { 
    case 0: 
     resId = R.layout.left; 
     break; 
    case 1: 
     resId = R.layout.right; 
     break; 
    } 

    View view = inflater.inflate(resId, null); 
    ((ViewPager) collection).addView(view, 0); 

    return view; 
} 

@Override 
public void destroyItem(final View arg0, final int arg1, final Object arg2) { 
    ((ViewPager) arg0).removeView((View) arg2); 

} 

@Override 
public boolean isViewFromObject(final View arg0, final Object arg1) { 
    return arg0 == ((View) arg1); 

} 

left.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="LEFT" /> 

</LinearLayout> 

right.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="50dp" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="@color/light_blue" > 


<TextView 
    android:id="@+id/textView2" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="RIGHT"/> 

</LinearLayout> 
+0

Sì, è possibile, tutto è possibile. Puoi dare qualche codice di ciò che hai fatto. – Warpzit

+0

Hai risolto? –

risposta

1

Guardando la fonte per ViewPager, questo non è qualcosa che è stato progettato per fare; usa la propria larghezza per calcolare le distanze di scorrimento ecc., con la chiara supposizione che tutti i bambini avranno la stessa larghezza del ViewPager stesso.

Per il caso specifico, potrebbe essere una soluzione alternativa, ad esempio,. È possibile specificare un margine tra le pagine adiacenti e questo margine può essere negativo per. Questo può dare il risultato che desideri, a condizione che l'ordine Z dei figli di ViewPager sia appropriato. Fare un tentativo e vedere se fa quello che ti serve.

2

Adrian ha esattamente ragione. ViewPager non è progettato per mostrare una parte del prossimo post come anteprima/teaser ma è possibile farlo. Nella mia classe ViewPagerCursorAdapter extends PagerAdapter corro questo:

public Object instantiateItem(View collection, final int position) { 
    cursor.moveToPosition(position); 
    View newView = getPageView(cursor, collection); 
    if (cursor.getCount() > 1) { 
     ((ViewPager)collection).setPageMargin(-overlapMargin); 
     if (! cursor.isLast()) { newView.setPadding(0, 0, overlapMargin, 0); } 
    } 
    ((ViewPager) collection).addView(newView); 
    return newView; //returns the object reference as the tag for identification. 
} 

È volontà correre in un problema di sovrapposizione strano z. Il trucco consiste nell'applicare lo sfondo solo sullo sfondo di ViewPager o applicarlo alla vista all'interno di per il nuovoView per il quale è stato appena impostato il riempimento. Sembra buono e funziona alla grande.

+0

Ho usato il codice sopra e sto facendo in modo che i child si sovrappongano in viewpager. Puoi aiutarmi su questo? – Noundla

9

Verificare la risposta di Murphy al numero this question. È necessario eseguire l'override del metodo di PagerAdapter getPageWidth() sulla tua classe PagerAdapter, in questo modo, per esempio:

@Override 
public float getPageWidth(int page) { 
    if(page==0) { 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     return (float)LEFT_FRAGMENT_PIXEL_WIDTH/size.x; 
    } 
    else 
     return super.getPageWidth(page); 
} 
Problemi correlati