2012-03-05 63 views
18

Tôi đang cố gắng sử dụng Fragment, ViewPager & co. từ thư viện hỗ trợ Android v4. Các đoạn dường như cuộn khi tôi nghe các sự kiện thay đổi trang từ máy nhắn tin nhưng nội dung không hiển thị. Những gì tôi về cơ bản có là:ViewPager với FragmentPagerAdapter không hiển thị nội dung

Một 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) { 

    } 

Một 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); 
    } 

} 

Và ba mảnh vỡ mà trông như thế này:

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

Và họ có bố trí như :

<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> 

tôi ban đầu quên để thêm cách bố trí chính, ở đây nói:

<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> 

tôi sẽ đánh giá cao nếu ai đó có thể cho tôi biết những gì tôi đang làm sai.

+0

bạn có thể cung cấp cách bố trí, trong đó có các ViewPager? Bạn đã đặt một breakpoint trong getItem() chỉ để chắc chắn rằng nó bắn? Ngoài ra, hãy đặt màu văn bản thành màu trắng trên các bản xem văn bản đó để đảm bảo! –

+0

oh yeah, đã thêm ngay bây giờ. – rgngl

+0

Trình xem của bạn có chiều cao được đặt để bao bọc nội dung và các trang của nó được đặt chiều cao để điền vào bố cục - điều này không có ý nghĩa và có thể có nghĩa là các trang của bạn đang chiếm không gian. Tôi nghi ngờ bạn muốn người xem có chiều cao của fill_parent. –

Trả lời

38

Điều này là do bạn đã ghi đè isViewFromObject trong MyPagerAdapter.

FragmentPagerAdapter xử lý isViewFromObject, vì vậy bạn không nên ghi đè lên.

Cũng như tôi, tôi nghĩ hầu hết khách truy cập bài đăng này bắt đầu bằng số PagerAdapter cơ bản, sau đó nhận ra rằng họ cần phải phân đoạn trang và thay đổi lớp cơ sở mà không nhận ra hậu quả. Thật không may, nhưng tôi không thể chỉ trích đội Android cho việc này.

+1

Tôi đã thay đổi từ một PagerAdapter đơn giản thành một FragmentPagerAdapter và không nhận ra vấn đề này. Cám ơn rất nhiều. – zgc7009

+0

bạn tiết kiệm trong ngày! –

+0

trình tiết kiệm cuộc sống, tôi không tìm thấy thông tin này ở bất cứ nơi nào khác ...! –

1

Ya đúng như Ian Newson nói, chỉ cần loại bỏ isViewFromObject phương pháp overrided từ mã của bạn

@Override 
    public boolean isViewFromObject(View view, Object object) { 
    return false; 
    } 
Các vấn đề liên quan