如何在首选项活动中获取当前片段?

时间:2016-05-09 11:28:59

标签: android android-fragments android-preferences

我已经实施了NFC扫描仪,当扫描标签时,成功调用onNewIntent方法,如下所示:

@Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    resolveIntent(intent);
}

resolveIntent中,我想根据扫描的标签更新用户界面。问题是我无法弄清楚如何获得对片段的引用。

我认为我可以使用isValidFragment方法获取片段,但到目前为止没有运气:

protected boolean isValidFragment(String fragmentName) {

    if (fragmentName != null && !fragmentName.equals("")) {
        Fragment f = getFragmentManager().findFragmentById(R.id.myFragment); // this is always null
        if (f != null && f instanceof MyFragment)
            myFragment = (MyFragment) f;
    }

    return PreferenceFragment.class.getName().equals(fragmentName)
            || GeneralPreferenceFragment.class.getName().equals(fragmentName)
            || MyFragment.class.getName().equals(fragmentName);
}

所以,基本上我唯一需要的是对当前片段的引用,然后我需要检查它是否是MyFragment,然后只是调用一个更新UI的方法。

我发现了一些类似的问题,但我仍然无法弄明白。我也尝试使用界面并进行回调,但我仍然不知道如何引用该片段。

编辑:这是pref_headers.xml文件:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    <header
        android:fragment=".SettingsActivity$GeneralPreferenceFragment"
        android:title="@string/pref_header_general" />
    <header
        android:fragment=".SettingsActivity$MyFragment"
        android:id="@+id/myFragment"
        android:title="Test" />
</preference-headers>

3 个答案:

答案 0 :(得分:3)

PreferenceActivity上,覆盖方法onAttachFragment。单击时,您可以参考片段。

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);
    }

答案 1 :(得分:0)

标题类没有扩展Fragment。所以这就是你总是得到null对象的原因。您正在尝试将一个对象转换为另一个无法变形或尝试以片段方式查找视图的对象。

打开DDMS并尝试转储View Hiearchy以了解PreferenceActivity的工作原理。看起来它解析给定的xml并膨胀另一个视图组件构建UI。

也许您可以尝试findViewById或加载不同的首选xml文件来更改UI。

答案 2 :(得分:-1)

初始化片段时,您可以将Tag设置为像这样的片段

mFT = mFragmentManager.beginTransaction();
mFT.replace(R.id.container, fragment, "myFragment");
mFT.commit();

然后当您想要检查片段时,您可以通过Tag

获取它
if (fragmentName != null && !fragmentName.equals("")) {
    Fragment f = getFragmentManager().findFragmentByTag("myFragment");
    if (f != null && f instanceof MyFragment)
        myFragment = (MyFragment) f;
}

希望有所帮助