Android:support.v4.app.Fragment的解决方法 - >片段classcastexception?

时间:2012-01-29 14:48:20

标签: android android-fragments backwards-compatibility

我正在尝试将support.v4.app.Fragment添加到PreferenceActivity标题中,如下所示:

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

这会引发ClassCastException,大概是因为PreferenceActivity期望子类为android.app.Fragment,而不是support.v4.app.Fragment

我的用例是这样的:
我有非标准片段,我想在&lt; 3.0和&gt; 3.0设备上使用它作为首选项。对于&gt; = 3.0,我需要一个android.app.Fragment子类,以便它可以嵌入到平板电脑设备上首选项活动的“详细信息窗格”中。对于&lt; 3.0,我需要一个v4.support.app.Fragment子类,所以我可以投入ActivityFragment

是否有一种解决方法可以让我在这种情况下使用兼容性片段?

2 个答案:

答案 0 :(得分:7)

PreferenceFragment不在Android支持包中,您不能以PreferenceActivity这种方式使用Android支持包Fragment类。此外,您的标题无论如何都无法在Android 2.x上运行,因为Android 2.x中的PreferenceActivity不知道片段。

原则上,您可以从源代码中分叉PreferenceActivity以创建一个使用Android支持版Fragment的代码。

或者,整理您的偏好设置以在Android 3.0+上使用片段,并在Android 2.x上避免它们。 Here is a sample project我展示了这样做的方法。

答案 1 :(得分:2)

正如@CommonsWare所指出的那样,如果不重写PreferenceActivity,就不可能实现我想要的东西,这看起来像是一堆工作。

我解决的不那么优雅的解决方案是创建两个PreferenceActivities(as shown here)并创建两个Fragment子类,每个子类用于Fragment的每种风格。

因此,PrefsActivityHC添加了此标题:

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

...虽然PrefsActivity添加了此偏好设置:

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

为了最大限度地减少两个几乎相同的片段所需的代码重复量,我创建了一个支持常见片段方法的MyFragmentDelegate类,并在MyFragment和{{1}中保存了一个实例。 }}。然后,只需将对这些片段中的方法的调用转发给委托:

MyFragmentHC