我有一个带有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_1Fragment
是Screen3Fragment
子级。Screen3Fragment
是父级。
我建议您始终使用getFragmentManager()
与add
方法,而不是replace
方法,因为您的父母将是相同的。getChildFragmentManager()
可以在片段中添加viewpager时使用。
关于android - 如何替换 fragment 中的 fragment ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45435687/