2012-01-29 27 views
6

Tôi đang cố gắng để thêm một support.v4.app.Fragment đến một PreferenceActivity tiêu đề, như vậy:Android: Giải pháp cho support.v4.app.Fragment -> Fragment classcastexception?

<header 
    android:fragment="com.example.SupportFragmentSubClass" 
    android:title="Selecting this should show the accompanying fragment" > 
</header> 

này ném một ClassCastException, có lẽ vì PreferenceActivity đang mong đợi một sub-class của android.app.Fragment, chứ không phải là support.v4.app.Fragment.

Trường hợp sử dụng của tôi là:
Tôi có phân đoạn không chuẩn mà tôi muốn sử dụng làm tùy chọn trên cả hai thiết bị < 3.0 và> 3.0. Đối với> = 3.0, tôi cần một lớp con android.app.Fragment để nó có thể được nhúng trong 'ngăn chi tiết' của hoạt động tùy chọn trên thiết bị máy tính bảng. Đối với < 3.0, tôi cần một lớp con v4.support.app.Fragment để tôi có thể ném vào một số ActivityFragment.

Có cách giải quyết nào cho phép tôi sử dụng Phân đoạn tương thích trong trường hợp này không?

Trả lời

7

PreferenceFragment không nằm trong gói Hỗ trợ Android và bạn không thể sử dụng gói Hỗ trợ Android Lớp Fragment theo số PreferenceActivity theo cách này. Hơn nữa, tiêu đề của bạn sẽ không hoạt động trên Android 2.x dù sao, vì PreferenceActivity trong Android 2.x không biết về phân đoạn.

Về nguyên tắc, bạn có thể chia rẽ PreferenceActivity từ mã nguồn để tạo một mã sử dụng phiên bản Hỗ trợ Android Fragment.

Hoặc, sắp xếp tùy chọn của bạn để sử dụng phân đoạn trên Android 3.0+ và tránh chúng trên Android 2.x. Here is a sample project nơi tôi thể hiện một cách để làm điều này.

+0

Xin lỗi, tôi không nghĩ giải pháp của @CommonsWare là hoàn hảo. Trên thực tế, chúng ta cần một Compatibility PreferenceFragment. Bởi vì PreferenceFragment có thể được đặt trong bất kỳ bố trí nào của bất kỳ hoạt động nào ngay cả khi hoạt động kéo dài từ ActionBarActivity. PreferenceActivity không mở rộng từ ActionBarActivity, nó không có bố trí ActionBar nhất quán trong tất cả các phiên bản Android. – Lei

2

Như @CommonsWare chỉ ra, không thể thực hiện những gì tôi muốn mà không cần viết lại PreferenceActivity và trông giống như một tải công việc.

Giải pháp không thanh lịch mà tôi đã giải quyết là tạo hai PreferenceActivities (as shown here) và cũng tạo hai phân lớp Fragment, một cho mỗi hương vị của Fragment.

Vì vậy, PrefsActivityHC thêm tiêu đề này:

<header 
    <!-- An android.app.Fragment subclass --> 
    android:fragment="com.example.project.MyFragmentHC" 
</header> 

... trong khi PrefsActivity thêm sở thích này:

<Preference> 
    <intent 
     <!-- A v4.support.app.Fragment subclass, wrapped in an ActivityFragment --> 
     android:targetClass="com.example.project.MyFragmentActivity" 
     android:targetPackage="com.example.project" > 
    </intent> 
</Preference> 

Để giảm thiểu sự trùng lặp dữ mã cần thiết để có hai mảnh gần như giống hệt nhau, Tôi đã tạo một lớp học MyFragmentDelegate hỗ trợ các phương thức phân đoạn chung và giữ một trường hợp đó trong MyFragmentMyFragmentHC. Các cuộc gọi đến các phương pháp trong những đoạn này sau đó chỉ được chuyển tiếp đến người được ủy quyền:

class MyFragment { 

    MyFragmentDelegate mDelegate; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    } 
} 

class MyFragmentHC { 

    MyFragmentDelegate mDelegate; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    } 
} 
Các vấn đề liên quan