2012-03-05 2 views
18

Sto provando a usare il frammento, ViewPager & co. dalla libreria di supporto Android v4. I frammenti sembrano scorrere quando ascolto eventi di cambio pagina dal cercapersone ma il contenuto non è visibile. Quello che in fondo ho è:ViewPager con FragmentPagerAdapter non mostra il contenuto

A FragmentActivity:

public class MyActivity extends FragmentActivity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     FragmentPagerAdapter fpa = new MyPagerAdapter(this, createFragments()); 

     ViewPager vp = (ViewPager) findViewById(R.id.pager); 
     vp.setAdapter(fpa); 
    } 

    private List<Fragment> createFragments() { 
     List<Fragment> list = new ArrayList<Fragment>(); 
     list.add(Fragment.instantiate(this, First.class.getName())); 
     list.add(Fragment.instantiate(this, Second.class.getName())); 
     list.add(Fragment.instantiate(this, Third.class.getName())); 

     return list; 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 

    } 

A FragmentPagerAdapter:

public class MyPagerAdapter extends FragmentPagerAdapter { 
    private List<Fragment> fragments; 

    public MyPagerAdapter(FragmentActivity activity, List<Fragment> fragments) { 
     super(activity.getSupportFragmentManager()); 
     this.fragments = fragments; 
    } 

    @Override 
    public Fragment getItem(int i) { 
     return fragments.get(i); 
    } 

    @Override 
    public int getCount() { 
     return fragments.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object o) { 
     return view.equals(o); 
    } 

} 

E tre frammenti che assomigliano a questo:

public class First extends Fragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.first, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 
} 

E hanno il layout come questi:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
    <TextView android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
       android:text="First Fragment" 
       android:id="@+id/firstText"/> 
</LinearLayout> 

Originariamente ho dimenticato di aggiungere il layout principale, qui si tratta:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:layout_width="fill_parent"/> 
</LinearLayout> 

sarei grato se qualcuno mi può dire quello che sto facendo male.

+0

si potrebbe fornire il layout che contiene il viewpager? Hai messo un punto di interruzione in getItem() solo per assicurarti che funzioni? Inoltre, imposta il textcolor su bianco in quelle visualizzazioni di testo solo per essere sicuro! –

+0

oh sì, l'ho aggiunto ora. – rgngl

+0

Il tuo viewpager ha l'altezza impostata per avvolgere il contenuto, e le pagine hanno l'altezza impostata per riempire il genitore - questo non ha senso e probabilmente significa che le tue pagine non occupano spazio. Sospetto che tu voglia che anche il viewpager abbia un'altezza di fill_parent. –

risposta

38

Questo perché si è sostituito a isViewFromObject in MyPagerAdapter.

FragmentPagerAdapter handle isViewFromObject, quindi non si dovrebbe sovrascriverlo.

Come con me, ritengo che la maggior parte dei visitatori di questo post abbia iniziato con un semplice PagerAdapter, quindi ha realizzato che avevano bisogno di frammenti di pagine e modificato la loro classe base senza rendersene conto. Sfortunato, ma non ho potuto criticare il team di Android per questo.

+1

Sono passato da semplice PagerAdapter a FragmentPagerAdapter e non ho realizzato questo problema. Grazie mille. – zgc7009

+0

risparmi la giornata! –

+0

salva-vita, non trovo queste informazioni da nessun'altra parte ...! –

1

Ya corretto come Ian Newson ha detto, è sufficiente rimuovere isViewFromObject metodo overrided dal codice

@Override 
    public boolean isViewFromObject(View view, Object object) { 
    return false; 
    }