2012-01-25 14 views
9

Tôi có một Hoạt động với một ViewFlipper mà lật giữa một loạt các khung nhìn (trang) với dữ liệu của tôi.ViewFlipper vs Fragments

Tôi đang xem xét việc sử dụng API phân đoạn để chuyển đổi giữa các chế độ xem của mình. Những lợi ích của việc làm như vậy là gì?

Tôi có thể thấy hiệu suất đạt được bằng cách sử dụng phân đoạn vì ViewFlipper về cơ bản chuyển đổi các cờ hiển thị và các mảnh thực sự thay thế cấu trúc phân cấp khi bạn thêm/xóa chúng?

Ai đó có thể cung cấp cho chúng tôi thông tin chi tiết hơn về điều này không?

Cảm ơn!

+2

Nếu bạn muốn phân tích hiệu suất, bạn nên tự mình thực hiện. Stack nói chung là không tốt trả lời các loại câu hỏi. – Warpzit

Trả lời

14

Phân đoạn thể hiện hành vi hoặc một phần giao diện người dùng trong một Hoạt động. Bạn có thể kết hợp nhiều đoạn trong một hoạt động để xây dựng giao diện người dùng nhiều cửa sổ và sử dụng lại một đoạn trong nhiều hoạt động. Bạn có thể nghĩ một mảnh như một phần mô-đun của một hoạt động, có vòng đời riêng, nhận các sự kiện đầu vào của chính nó và bạn có thể thêm hoặc xóa trong khi hoạt động đang hoạt động (giống như một "hoạt động phụ" mà bạn có thể tái sử dụng trong các hoạt động khác nhau).

Một đoạn luôn phải được nhúng trong một hoạt động và vòng đời của mảnh bị ảnh hưởng trực tiếp bởi vòng đời của hoạt động chủ nhà. Ví dụ: khi hoạt động bị tạm dừng, tất cả đều là phân đoạn trong đó và khi hoạt động bị hủy, tất cả đều là các phân đoạn. Tuy nhiên, trong khi một hoạt động đang chạy (nó đang ở trạng thái vòng đời tiếp tục), bạn có thể thao tác từng đoạn một cách độc lập, chẳng hạn như thêm hoặc loại bỏ chúng. Khi bạn thực hiện một giao dịch phân đoạn như vậy, bạn cũng có thể thêm nó vào một ngăn xếp được quản lý bởi hoạt động đó — mỗi mục nhập ngăn xếp lại trong hoạt động này là bản ghi giao dịch phân đoạn đã xảy ra. Ngăn xếp lưng cho phép người dùng đảo ngược giao dịch phân đoạn (điều hướng ngược), bằng cách nhấn nút BACK.

Nhưng ViewFlipper hoạt động trong một hoạt động. ViewAnimator đơn giản sẽ hoạt ảnh giữa hai hoặc nhiều chế độ xem đã được thêm vào đó. Chỉ có một đứa trẻ được hiển thị tại một thời điểm.Nếu được yêu cầu, có thể tự động lật giữa mỗi đứa trẻ một cách đều đặn.

3

EDIT: Tôi đang nói về ViewPager tại đây chứ không phải ViewFlipper.

Lợi ích của việc sử dụng ViewPager là nó rất dễ sử dụng. Bạn chỉ cần tạo một FragmentPagerAdapter và điền vào một vài trường đơn giản. Dưới đây là một ví dụ mà tôi đã viết để hiển thị các mục được truyền từ lớp cha.

public static class DashboardPagerAdapter extends FragmentPagerAdapter { 

    private static final int NUM_ITEMS_PER_SCREEN = 12; 

    private List<View> mAllItems; 
    private int mNumScreens; 

    public DashboardPagerAdapter(FragmentManager fm, List<View> allItems) { 
     super(fm); 
     mAllItems = allItems; 
     mNumScreens = (int) Math.ceil(mAllItems.size() 
       /(float) NUM_ITEMS_PER_SCREEN); 
     Log.d(TAG, "num screens: " + mNumScreens); 
    } 

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

    @Override 
    public Fragment getItem(int position) { 
     DashboardScreenFragment screen = DashboardScreenFragment 
       .newInstance(); 

     for (int i = position * NUM_ITEMS_PER_SCREEN; i < (position + 1) 
       * NUM_ITEMS_PER_SCREEN; i++) { 
      if (i >= mAllItems.size()) { 
       break; 
      } 
      screen.addChild(mAllItems.get(i)); 
     } 
     return screen; 
    } 
} 

Và đặt nó lên là siêu đơn giản:

final DashboardPagerAdapter adapter = new DashboardPagerAdapter(
      getFragmentManager(), mAllButtons); 

Trái với những gì @ sebap123 nói, bạn có thể sử dụng mảnh vỡ với Android v4 trở lên với Thư viện hỗ trợ; xem http://developer.android.com/sdk/compatibility-library.html để biết chi tiết, nhưng nó thực sự chỉ liên quan đến việc đưa tệp jar vào thư mục/libs của bạn.

BTW, lưu ý rằng với ViewPager, mỗi "trang" tự là một Phân đoạn.

Để biết liệu có cải thiện hiệu suất hay không, điều đó tùy thuộc vào những gì bạn đang so sánh. Tôi khuyên bạn nên thử dùng ViewPager và chỉ sau khi lo lắng về vấn đề hiệu suất. Như Donald Knuth nói, "Chúng ta nên quên đi những hiệu quả nhỏ, nói khoảng 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi điều ác."

Trong mọi trường hợp, nếu bạn có số lượng lớn trang, hãy xem http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html để có bộ tiếp hợp phù hợp hơn.

+1

Tôi đang nói về việc sử dụng một ViewFlipper để lật giữa các đoạn. Tôi đang đề cập đến việc so sánh giữa việc sử dụng FragmentManager để thêm/loại bỏ các phân đoạn so với sử dụng một ViewFlipper mà chỉ lật qua các lần xem (không phải là phân đoạn một lần nữa!) – dnkoutso

+0

Sự khác biệt là trong hình ảnh. Nếu bạn muốn người dùng có thể vuốt ngang giữa các màn hình, bạn nên sử dụng ViewFlipper. Nếu bạn chỉ muốn thêm và xóa các đoạn (ví dụ: với các nút), bạn nên sử dụng Trình quản lý phân đoạn. –

+1

Wow, bạn biết những gì tôi vừa nhận ra? Tôi đã nói về ViewPager toàn bộ thời gian này, không phải ViewFlipper. ViewFlipper hoàn toàn khác, tôi xin lỗi. Thay vì xóa toàn bộ điều, tôi sẽ chỉnh sửa và thay thế "ViewFlipper" bằng ViewPager, mặc dù nó không trả lời trực tiếp câu hỏi. –