我有一个Honeycomb风格的偏好。我定义了标题:
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header android:id="@+id/pref_general" android:fragment="MyPreferencesFragment" android:title="@string/pref_general_title">
<extra android:name="resource" android:value="pref_general" />
</header>
<header android:id="@+id/pref_sharing" android:fragment="MyPreferencesFragment" android:title="@string/pref_sharing_title">
<extra android:name="resource" android:value="pref_sharing" />
</header>
</preference-headers>
然后我将它们加载到PreferenceActivity:
public void onBuildHeaders(List<Header> target)
{
loadHeadersFromResource(R.xml.preference_headers, target);
}
如何通过startPreferenceFragment中的ID解决精确的Fragment?如何访问与该片段对应的列表项,以便启用/禁用它?
答案 0 :(得分:2)
我找到了解决方案。无法直接访问片段,但可以通过ListAdapter
找到它。在您的PreferenceActivity中,您可以写下:
int fragmentId = R.id.pref_sharing;
for (int i = 0; i < getListAdapter().getCount(); i++)
{
Header header = (Header) getListAdapter().getItem(i);
if (fragmentId == header.id)
{
// You can access a fragment name (class)
String fragment = header.fragment;
// You can access fragment arguments
Bundle args = header.fragmentArguments;
}
}
我没有找到禁用标题列表项的方法,但我根据此代码创建了一种解决方法。
答案 1 :(得分:0)
您可以直接访问PreferenceFragment。事实上,可能有几种方法可以做到这一点。我已经尝试了下面的第一个,它肯定有效。另外两个我没有尝试过,但我认为没有理由不这样做。
onAttach()
并将对自身的引用(即this
)传递给传入的活动。在主机活动中保留引用的副本并使用它来调用任何引用稍后您想要在片段中使用的方法。有关示例,请参阅here。感谢@Devunwired提供此解决方案。this
。您可以使用getId在onAttach()
方法中获取片段的ID。然后使用活动中的常规findFragmentById在需要时检索片段。onAttach()
或onCreate()
中的getId找到该变量你的片段。然后像以前一样在您的活动中使用findFragmentById。这涉及的编码少于(1)或(2),但这是一个丑陋的黑客!如果Android更容易直接访问标题中的片段,那将会很好。有一段时间我无法理解为什么在布局XML中使用android:id
值不能与findFragmentById
一起使用,直到我意识到header不是片段!