为什么findFragmentById总是返回null

时间:2014-07-22 02:06:10

标签: java android android-fragments fragment fragmentmanager

我正在尝试使用findFragmentById来获取我的片段,但每当我在其位置上获得null时,我也尝试使用findFragmentByTag并在我的add事务中添加标记,但这也是相同的。

以下代码是修改后的空白起始模板(为简单起见)

公共类MainActivity扩展了Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();

    if (savedInstanceState == null) {
        fragmentManager.beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }

    PlaceholderFragment placeholderFragment = (PlaceholderFragment) fragmentManager
            .findFragmentById(R.id.container);

    if (placeholderFragment == null) {
        Log.i("TAG", "placeholderFragment is null");
    } else {
        Log.i("TAG", "placeholderFragment is not null");
    }
}

public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
    }
}

}

我尝试用add(R.id.container, new PlaceholderFragment(), "TAG")替换添加内容,然后尝试使用findFragmentByTag("TAG")访问该内容,但也没有成功。

如何让我的代码按预期工作?

1 个答案:

答案 0 :(得分:3)

我认为问题在于您在添加Fragment后尝试立即找到它。在那个小时间内,Fragment可能尚未添加。

你能做的就是你在添加片段时已经有了片段。

findFragmentById()函数通常用于在您已经添加一段时间之后访问其他函数中的Fragments

这是一个例子

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();
    PlaceholderFragment placeholderFragment = new PlaceholderFragment();

    if (savedInstanceState == null) {
        fragmentManager.beginTransaction()
                .add(R.id.container, placeholderFragment).commit();
    }
}

public void anotherFunc() {

    PlaceholderFragment placeholderFragment = (PlaceholderFragment) fragmentManager
            .findFragmentById(R.id.container);
}