gpt4 book ai didi

android - 一页包含多个 fragment 的 ViewPager "java.lang.IllegalArgumentException: No view found for id"

转载 作者:IT老高 更新时间:2023-10-28 23:33:07 26 4
gpt4 key购买 nike

在我的小型 Android 应用程序中,我有一个包含 3 个页面的 ViewPager,每个页面包含一个 fragment ,使用 FragmentStatePagerAdapter 一切正常(参见 earlier question ) .

现在对于更大的屏幕,我想保留一个 ViewPager,但我希望前两个 fragment 位于同一个第一页上。

为此,我实现了自己的 PagerAdapter,这主要是有效的,我要解决的唯一问题是当我旋转屏幕时,我收到一个错误:

12-11 16:34:13.526: ERROR/AndroidRuntime(9221): FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matthieu/com.matthieu.TestActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f030002 (com.matthieu:id/top_fragment) for fragment TestFragment{481a3a98 #0 id=0x7f030002}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815)
at android.app.ActivityThread.access$2400(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f030002 (com.matthieu:id/top_fragment) for fragment TestFragment{481a3a98 #0 id=0x7f030002}
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.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1861)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:547)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129)
at android.app.Activity.performStart(Activity.java:3781)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2636)
... 12 more

我在 GitHub 上放了一个示例代码来模拟我正在尝试做的事情(并显示此错误消息) .

我想我遇到的一个问题是由于我在实际应用程序中拥有的 fragment ,我不能真正拥有 static newInstance 构造函数,而是提前创建 fragment 并具有'setRetainInstance (真的);'设置。

我了解将包含 fragment should be part of the hierarchyviewGroup 的 ID ,最终,我猜,它是......

如果有什么不同,我将使用支持库和 SherlockActionBar 来保持与旧设备的向后兼容性。

你知道怎么做吗?

EDIT:我发现如果我从 onSaveInstanceState 中的 FragmentManager 中删除 fragment ,我不会再遇到任何崩溃。所有的 fragment 都是从头开始重新创建的,这不是我想要的,但我想我可能不得不这样做并稍后以某种方式恢复这些 fragment ......

最佳答案

好吧,虽然我换了另一种做事方式,但我不喜欢留下不完整的东西……

按照 Mark 的建议采用嵌套 Fragments 的方式。评论中发布的链接转到 404,但我找到了您的 example code关于嵌套 fragment 。

我在路上学到了一些东西:

  • 嵌套 fragment 不能有setRetainInstance(true),否则会得到:

    java.lang.IllegalStateException: 无法保留嵌套在其他 fragment 中的 fragment

  • ViewPager的页面中创建一个FrameLayout来保存fragment是错误的。查看 Android 代码(特别是 FragmentPagerAdapter),我应该只使用 container.getId() 来查找添加 Fragment 的位置。看起来你不能在那个级别做任何更复杂的事情,否则它会崩溃。

  • 据我了解,如果 fragment 包含一些需要很长时间才能加载的信息(就像我一样),则处理此问题的不同方法是:

    • 使用 onSaveInstanceState(首选方式?),但如果 Fragment 是嵌套的,则不可能。框架需要时会调用(空)构造函数。
    • 使用setRetainInstance(true),在那种情况下savedInstanceBundle总是null,但是那个Fragment(作为Java对象)不会被销毁它仍然会通过 onAttach/onCreateView。
    • 寻找其他方法来保存和恢复您需要的内容...

无论如何,我在 github 上使用嵌套 fragment 推送了我的解决方案

关于android - 一页包含多个 fragment 的 ViewPager "java.lang.IllegalArgumentException: No view found for id",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13816442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com