为啥 findFragmentById 总是返回 null

Posted

技术标签:

【中文标题】为啥 findFragmentById 总是返回 null【英文标题】:why does findFragmentById always returns null为什么 findFragmentById 总是返回 null 【发布时间】:2014-09-12 16:58:26 【问题描述】:

我正在尝试使用 findFragmentById 获取我的片段,但每次我在其位置获得 null 时,我也尝试使用 findFragmentByTag 并向我的添加事务添加标签,但这也是一样的。

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

公共类 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】:

我认为问题在于您在添加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);

【讨论】:

以上是关于为啥 findFragmentById 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章

findFragmentById 返回 null

迁移到 AndroidX 后,findFragmentById 为片段返回 null

Fragment使用findFragmentById返回null

Android findFragmentById 返回 null

SupportMapFragment 的 findFragmentById 在 Android Studio 中返回 null

getSupportFragmentManager().findFragmentById 为 android 片段中的谷歌地图返回 null?