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