【问题标题】:Android replace fragment doesn't hide underlying fragmentAndroid替换片段不隐藏底层片段
【发布时间】:2013-03-16 21:54:04
【问题描述】:

我有以下问题:

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

【问题讨论】:

    标签: java android fragment


    【解决方案1】:

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

    根据documentation,当你使用<fragment>标签时会发生这种情况:

    系统将fragment返回的View直接插入到位 元素。

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

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

    那么FragmentTransaction.replace() 方法应该可以工作了。

    【讨论】:

    • 在我的 xml 中没有,我只是定义了线性布局,所以没有片段标签。我动态添加它们,所以这不会是问题。我使用 viewpageradapter 来获取屏幕上的片段
    【解决方案2】:

    那么你为什么不直接调用EditText Fragment 上的.remove().add() 新的TextView Framgent 而不是使用.replace()

    做一些这样的事情:

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

    这对我有用。

    【讨论】:

    • 我试过这个,但是应用程序崩溃了,我可能不得不说我在 xml 布局文件中没有定义片段,我动态添加它们。 transaction.add(R.id.flQuestion, howFragment).remove((Fragment) btn.getTag()).commit;
    • 致命异常:主要 java.lang.IllegalArgumentException:找不到片段 HowFragment{419c93c8 #3 id=0x7f090015} 的 id 0x7f090015 (com.example.eindwerkappv1:id/flQuestion) 的视图
    • 请编辑您的问题,并将完整的堆栈跟踪粘贴到您的问题中。
    • 你能告诉你当前的代码吗?这是您现在使用的代码:“transaction.add(R.id.flQuestion, howFragment).remove((Fragment) btn.getTag()).commit;”?
    • 首先,永远不要使用 Fragment 作为 Fragment 的名称……给对象赋予与其自身相同的名称是一种不好的做法,它可能会给您带来问题。其次,如果 Fragment 片段已经在您的 flQustion 中(我猜它是 FrameLayout),那么 remove 方法应该首先出现,并且只有在您应该添加新的方法之后,正如我在我的回答中所写的那样......试试它并告诉我结果是什么,您是否尝试检查 0x7f090015 视图是什么?
    【解决方案3】:

    我现在找到了解决方案。

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

    Fragment over another fragment issue

    答案见上一个链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2021-08-26
      • 2019-06-27
      • 2023-04-04
      • 2012-04-21
      • 1970-01-01
      • 2014-10-29
      相关资源
      最近更新 更多