我有一个带有viewpager的活动,viewpager的每个页面都有一个片段。
在我的Screen3Fragment中,我有一个线性布局(lly_fragments),其中我显示了一些其他片段。我首先显示片段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替换现有的frag31
但是,我不知道为什么。

最佳答案

getFragmentManager()将始终从父级返回属性,在大多数情况下返回活动。getChildFragmentManager()将返回父属性(在您的情况下,Screen3Fragment属性)。在片段中添加片段时应该使用它。
在您的案例中,Screen3Fragment应该使用getFragmentManager()添加,而Screen3_1Fragment应该使用getChildFragmentManager()添加,因为Screen3_1FragmentScreen3Fragment子级。Screen3Fragment是父级。
我建议您始终使用getFragmentManager()add方法,而不是replace方法,因为您的父母将是相同的。
getChildFragmentManager()可以在片段中添加viewpager时使用。

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

10-10 20:10