从片段

时间:2016-04-18 18:20:05

标签: android android-fragments android-databinding

我有一个带有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以及其他所有内容都是最新的。

2 个答案:

答案 0 :(得分:0)

R.id.fragment_container不是您片段的一部分。相反,它是容器活动的一部分。

如果要添加/替换片段中的任何片段,您应该使用侦听器接口向容器活动发送回调,然后在容器活动中,您应该执行startFragment()

答案 1 :(得分:0)

startFragment中的

而不是getSupportFragmentManager()使用getParentFragment()。getFragmentManager();

希望它能帮到你