我正在尝试将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
。
是否有一种解决方法可以让我在这种情况下使用兼容性片段?
答案 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