我有以下问题:
我的应用程序包含动态添加的几个片段。有一个带有按钮和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)
最佳答案
我猜您的fragA
片段是在XML布局中定义的吗?
根据documentation,这是使用<fragment>
标记时发生的情况:
系统直接将片段返回的视图插入到位
的元素。
这就是为什么您不能删除以前的片段的原因,因为它不存在。
如果要更改代码中的片段,则也必须添加代码中的第一个片段。
您需要使用类似FrameLayout
的容器,并使用onCreate()
将第一个片段添加到您活动的FragmentTransaction.add()
中的该容器中。
然后FragmentTransaction.replace()
方法应该起作用。