android - 如何替换 fragment 中的 fragment ?

标签 android android-fragments

我有一个带有 ViewPager 的 Activity,ViewPager 的每个页面都有一个 Fragment。

在我的 Screen3Fragment 中,我有一个 LinearLayout (lly_fragments),我在其中显示了一些其他 fragment 。我首先显示 fragment Screen3_1

public class Screen3Fragment extends Fragment {

    private FragmentManager manager;
    private FragmentTransaction transaction;


    public static Screen3Fragment newInstance() {
        final Screen3Fragment mf = new Screen3Fragment();
        return mf;
    }

    public Screen3Fragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_screen3, container, false);
        Screen3_1Fragment frag31 = new Screen3_1Fragment();
        manager = getChildFragmentManager();
        transaction = manager.beginTransaction();
        transaction.add(R.id.lly_fragments,frag31,"frag31");
        transaction.addToBackStack("frag31");
        transaction.commit();
        return v;
    }

}

这工作正常,没有问题。当我想从 frag31(位于 Screen3Fragment 内)中调用 fragt32 时,问题就来了,为此我执行以下操作。

public class Screen3_1Fragment extends Fragment {

    private ImageButton imgbt_timer;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_screen3_1,container,false);
        imgbt_timer = (ImageButton) v.findViewById(R.id.bT_scr31_timer);
        imgbt_timer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getChildFragmentManager().beginTransaction()
                                            .replace(R.id.lly_fragments, new Screen3_2Fragment(), "frag32")
                                            .commit();
            }
        });


        return v;
    }
}

正如我在其他答案中读到的那样,行 transaction.replace 应该可以解决问题,并用给定的 frag32 替换现有的 frag31相同的给定容器 lly_fragments

但是,我得到 java.lang.IllegalArgumentException: No view found for id..... 我不知道为什么。

最佳答案

getFragmentManager()将始终返回来自父级的属性,在大多数情况下是 Activity 。 getChildFragmentManager()将返回父属性(在您的例子中,Screen3Fragment 属性)。当您在 fragment 中添加 fragment 时应该使用它。

在你的例子中,Screen3Fragment应使用 getFragmentManager() 添加和 Screen3_1Fragment应使用 getChildFragmentManager() 添加因为Screen3_1FragmentScreen3Fragment child 。 Screen3Fragment是 parent 。

我建议您始终使用 getFragmentManager()add方法,不是 replace因为你的 parent 将是一样的。

getChildFragmentManager()可以在 fragment 内添加 ViewPager 时使用。

关于android - 如何替换 fragment 中的 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45435687/

相关文章:

java - 如何在 Android 用户界面中显示计时器

android - 对话框 fragment 问题 : onCreateDialog not called; can't get back key press

java - 更改 Fragment 内的 TextView 给我 NullPointerException

java - 如何添加评价我的应用程序弹出消息 android?

Android ListFragment游标管理

android-studio - 从片段更改 Activity 的按钮状态

android - 无法保存和恢复嵌套 fragment ?

安卓| Dagger 2.根据条件将不同的子类注入(inject)Fragment

android - 如何将上传文件的名称更改为 firebase 存储?

java - 如何在Android中乘以旋转器的值