2

我有以下问题:

我的应用程序由几个动态添加的片段组成。有一个带有按钮和文本编辑器的片段(称为“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)
4

3 回答 3

2

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

根据文档<fragment>,这是使用标签时发生的情况:

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

这就是为什么您不能删除前一个片段,因为它不存在。如果要从代码中更改片段,则还必须从代码中添加第一个片段。

您需要使用像 aFrameLayout这样的容器,并onCreate()使用FragmentTransaction.add().

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

于 2013-03-15T14:59:00.673 回答
0

那么你为什么不直接调用.remove()FragmentEditText.add()newTextView Framgent而不是 osing.replace()

做这样的事情:

fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(addCommentFragment)
.add(R.id.containerForFragments, commentFragment, "comment"+ 
String.valueOf(numOfComments)).commit();

这对我有用。

于 2013-03-15T14:43:44.537 回答
0

我现在找到了解决方案。

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

另一个片段问题的片段

答案见上一个链接

于 2013-03-16T13:54:04.973 回答