Android中的findFragmentByTag返回null

3
我希望从父活动中调用片段方法。为此,我需要片段的对象。
父活动在FrameLayout中包含片段,如下所示:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/bottom_buttons"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"

这是获取片段对象的代码。
FragmentBottomButtons fragment = new FragmentBottomButtons();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.bottom_buttons, fragment,"FragmentTag");
        //ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        //ft.addToBackStack("");
        ft.commit();


        /*
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.bottom_buttons, new FragmentBottomButtons())
                .commit();

        */
        frag = (FragmentBottomButtons) getSupportFragmentManager().findFragmentByTag("FragmentTag");
        //fragmentBottomButtons = (FrameLayout)findViewById(R.id.bottom_buttons);
        if (frag == null){
            Utility.displayToast("fragmnt is null");
        }

但是它返回了null。

有人可以帮我解决吗?这里出了什么问题?


1
尝试在获取片段之前执行fragmentManager.executePendingTransactions(); 看看是否有效。commit() 异步工作,可能会在操作完全完成之前调用它。 - aminner
2个回答

7

当您使用commit()方法时,没有人能保证您的片段将立即附加到FragmentManager中。

这是由于内部FragmentManager逻辑造成的:当您添加\替换\删除任何片段时,您创建了一个FragmentTransaction并将其放入FragmentManager内的执行队列中。实际上,所有事务都在等待FragmentManager排队任务。

为避免这种情况,您可以通过每个任务强制将其排队到Fragment下来避免。

getSupportFragmentManager().executePendingTranscation();

这种方法启动挂起的事务,并且更加确保使用findFragmentById()方法的安全性。

因此,最终您需要:

CustomFragment fragment = new CustomFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//add or replace or remove fragment
ft.commit();

getSupportFragmentManager().executePendingTranscation();

CustomFragment customFragment = (CustomFragment) getSupportFragmentManager().findFragmentByTag("FragmentTag");

"FragmentManager正在执行事务" - BabyishTank

0

您的Fragment尚未附加。您需要稍后调用findFragmentByTag()。例如,您可以向Fragment添加侦听器,并在onAttach()方法中调用您的Activity,以告诉您的Activity您的Fragment已创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接