Android替换片段不隐藏底层片段

时间:2013-03-15 14:40:48

标签: java android fragment

我有以下问题:

我的应用程序由几个动态添加的片段组成。有一个片段带有一个按钮和一个textedit(称为'fragA')。

如果我单击按钮,我想显示带有一些文本的不同片段(称为“fragB”)。我使用以下代码(在fragA类中)执行此操作:

btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
            Fragment howFragment = new HowFragment();

            FragmentTransaction transaction = null;
            transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.flQuestion, howFragment);
            transaction.addToBackStack(null);
            transaction.commit();

            }
        });

现在的问题是:

当我按下fragA上的按钮时,片段(fragB)被创建并显示在屏幕上但是当我按下按钮在fragA上的位置时,它会创建一个新片段(fragB)。此外,如果我推送fragA上的textedit所在的位置,它会在fragB上打开键盘..

看起来FragB只是覆盖了fragA而没有替换它。

我也希望实现这一点,当我转换到下一个片段,删除了fragB并且fragA只是正常显示(没有按下按钮时的状态)

更新#

尝试添加和删除时,以下是logcat输出:

FATAL EXCEPTION: main
java.lang.IllegalArgumentException: No view found for id 0x7f090015      (com.example.eindwerkappv1:id/flQuestion) for fragment HowFragment{419c93c8 #3   id=0x7f090015}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)  
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at   android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4441)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:2)

我猜你的fragA片段是在你的XML布局中定义的吗?

根据documentation,这是使用<fragment>标记时会发生的情况:

  

系统直接将片段返回的视图插入到位   元素。

这就是为什么你不能删除以前的片段,因为它不存在。 如果你想从代码中更改片段,你也必须从代码中添加第一个片段。

您需要使用FrameLayout之类的容器,并使用FragmentTransaction.add()在活动的onCreate()中将第一个片段添加到此容器中。

然后FragmentTransaction.replace()方法应该有用。

答案 1 :(得分:0)

那你为什么不拨打.remove()片段上的EditText和新.add() TextView Framgent而不是{{1} }}

做这样的事情:

.replace()

这对我有用。

答案 2 :(得分:0)

我现在找到了解决方案。

我仍然使用replace方法,但我必须在新片段中捕获ontouch事件:

Fragment over another fragment issue

请参阅上一个链接以获取答案