如何通过id访问PreferenceFragment?

时间:2011-12-01 20:48:35

标签: android android-3.0-honeycomb

我有一个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?如何访问与该片段对应的列表项,以便启用/禁用它?

2 个答案:

答案 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。事实上,可能有几种方法可以做到这一点。我已经尝试了下面的第一个,它肯定有效。另外两个我没有尝试过,但我认为没有理由不这样做。

  1. 覆盖片段中的onAttach()并将对自身的引用(即this)传递给传入的活动。在主机活动中保留引用的副本并使用它来调用任何引用稍后您想要在片段中使用的方法。有关示例,请参阅here。感谢@Devunwired提供此解决方案。
  2. 与(1)相同,但将片段的id传递给主机活动而不是this。您可以使用getIdonAttach()方法中获取片段的ID。然后使用活动中的常规findFragmentById在需要时检索片段。
  3. 使用片段的ID更新主机活动中的静态int变量(直接或通过公共方法),您可以使用onAttach()onCreate()中的getId找到该变量你的片段。然后像以前一样在您的活动中使用findFragmentById。这涉及的编码少于(1)或(2),但这是一个丑陋的黑客!
  4. 如果Android更容易直接访问标题中的片段,那将会很好。有一段时间我无法理解为什么在布局XML中使用android:id值不能与findFragmentById一起使用,直到我意识到header不是片段!