我有一个带有FrameLayout的Activity片段。 我以标准方式添加片段:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
ProfileFragmentFirst profileFragmentFirst = new ProfileFragmentFirst();
Bundle args = new Bundle();
args.putSerializable(ExtrasTags.ARG_PROFILE_OBJECT, profileObject);
profileFragmentFirst.setArguments(args);
transaction.replace(R.id.fragment_container, profileFragmentFirst);
transaction.commit();
这完全没问题。
在片段中我有一个按钮,当点击它时,需要用另一个按钮替换当前活动的片段。 它调用活动中的方法来执行此操作:
@Override
public void startFragment(Fragment fragment) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
当我这样做时,应用程序失败并出现以下错误
java.lang.IllegalArgumentException: No view found for id 0x7f0d00cb (com.digle.android:id/fragment_container) for fragment ProfileBadgesFragment{2239633d #1 id=0x7f0d00cb}
因此,它声称,即使我之前使用它,它也找不到片段的FrameLayout! 再多一点搜索,我发现它正在查看Fragment布局内部的布局,而不是在Activity内部(我通过在片段布局中添加一个FrameLayout来证明这一点,并且看到我的第二个片段出现在那里)。
但是,此代码在我的应用程序的其他位置完美运行。
两种情况之间的主要区别在于,在这种情况下,第一个片段使用数据绑定,而在它工作的情况下,它不会。 我单击的按钮绑定到事件对象。
例如:
<Button
..
..
android:onClick="@{clicksListener.onBadgesClick}"
/>
使用:
public class ClicksListener {
public void onBadgesClick(View view) {
Log.d(TAG, "onBadgesClick");
ProfileBadgesFragment profileBadgesFragment = new ProfileBadgesFragment();
Bundle args = new Bundle();
args.putSerializable(ExtrasTags.ARG_PROFILE_BADGES, profileObject.userBadgesEntity);
profileBadgesFragment.setArguments(args);
startFragment(profileBadgesFragment);
}
}
当然还有绑定。点击效果很好,但正如我之前所说,它会查看片段布局而不是活动布局。
使用构建工具23.0.3以及其他所有内容都是最新的。
答案 0 :(得分:0)
R.id.fragment_container
不是您片段的一部分。相反,它是容器活动的一部分。
如果要添加/替换片段中的任何片段,您应该使用侦听器接口向容器活动发送回调,然后在容器活动中,您应该执行startFragment()
。
答案 1 :(得分:0)
而不是getSupportFragmentManager()使用getParentFragment()。getFragmentManager();
希望它能帮到你