【发布时间】:2013-01-07 22:52:53
【问题描述】:
2013 年 1 月 16 日编辑:问题已解决!两天前,我发布了应用程序的更新版本,并正确识别了ListViews,就像我最初所做的那样,使用android:id="@android:id/list。但实际上,抛出的异常具有误导性,与实际问题无关......
当我实施 Sean 提出的通过将 null 传递给 ViewGroup 来增加 ListFragment 视图的建议时,真正的解决方案来了。我没有收到来自新版本的相同异常,并且新版本已被足够多的设备下载,可以安全地说此问题已解决。但是,我非常感谢 Lawrence 的 cmets 和回答,并将继续阅读有关他如何实例化 Fragments 的信息。虽然他提供了将 null 传递给 View inflater 的建议,但实际上 Sean 是第一个这样做的,并且由于他的解决方案似乎已经解决了问题,因此将相应地奖励赏金。如果我了解/阅读更多关于实例化片段的不同方法的信息,我将在未来更新这个线程,正如劳伦斯的出色回答所建议的那样。可惜我不能分红!
编辑 1/14/2013: ListView 相关的 XML 文件位于 http://pastebin.com/2xnG1VfF @LawrenceChoy 的要求
2013 年 1 月 13 日编辑:我发布了我的应用程序的更新版本,并根据 Bishan 的建议使用了 android:id="@+id/android:list 而不是 android:id="@android:id/list",但是我仍然收到我的 Fragment Activity 的随机异常没有a ListView whose id attribute is 'android.R.id.list',即使该活动没有任何ListViews。添加了 LGE 手机的另一个例外。
编辑 2013 年 1 月 9 日: 虽然 Bishan 提供了答案,但我希望能得到更多解释,说明他的解决方案为何可以防止此异常。进一步阅读后,我相信这是因为在使用自定义 ListView 时,应该使用 + 符号。但是想得到确认我是正确的或得到澄清,特别是考虑到两者似乎都可以在许多不同的设备和模拟器上工作。在大约 20 分钟内筹集赏金以寻求有关此事的信誉良好的消息来源/答案。谢谢。
在最近更新到 Play 商店后,我发现一些设备出现了一些非常奇怪的行为。
在我的新版本中,我有一个 FragmentActivity(称为 TabsStyled),它使用 FragmentStatePagerAdapter 来管理多个片段。我总共有 4 个片段,其中 2 个片段扩展了 ListFragment,并且列表视图由 LoaderManager 和 CursorLoader 填充,全部来自 support.v4 库。其他两个片段没有ListViews,也没有扩展ListFragment。
我在多个设备以及 AVD 上进行了广泛的测试,并且从未遇到过因缺少 android.R.id.list 而导致的任何 RuntimeExceptions。
但是,在发布后,FragmentAcitivty "Your content must have a ListView whose id attribute is 'android.R.id.list'" 出现了一些 ACRA 崩溃。 TabsStyled.class 是管理 ListFragments 的FragmentActivity,它本身没有任何“ListViews”。这对我来说似乎很奇怪,因为我认为如果要抛出这个异常,它应该是 ListFragment 之一,而不是“父”FragmentActivity。
这是堆栈跟踪的顶部,我很乐意根据要求提供任何其他代码或信息,而不是在此处粘贴所有内容。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.hiddenforsecurity/com.myapp.hiddenforsecurity.TabsStyled}:
java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
此处的 pastebin 上提供了完整的堆栈跟踪:http://pastebin.com/aiV7pwXP。
包含 ListViews 的每个 ListFragments 的 XML(每个 ListFragment 的单独 XML 中的单独 ListView):
<ListView android:id="@android:id/list"
<!--the release currently uses "@+id/android:list)-->
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="45" />
其中一个ListFragments(稍加简化以便于诊断)上传到pastebin(另一个ListFragment非常相似):http://pastebin.com/Nts3nVx1
还有一个稍微简化的完整版 TabsStyled (FragmentActivity):http://pastebin.com/ZS4Xg8kP
迄今为止创建异常的设备(截至 1/14,它们继续发布崩溃):
MODEL BRAND ANDROID API
GT-I9305 Samsung 4.1.1 (using @android:id/list)
GT-S7562 Samsung 4.0.4 (using @android:id/list)
GalaxyNexus Samsung 4.2.1 (same exception seen with @+id/android:list)
L-01E LGE 4.0.4 (same exception seen with @+id/android:list)
【问题讨论】:
-
从 logcat 中可以看到,当错误发生时,Activity 正在尝试创建
ListFragment。你能发布那些ListFragment的所有布局文件吗?另外,id的正确形式应该是`android:id="@android:id/list",如下所述,碧山的回答是不正确的。 -
感谢@LawrenceChoy 的评论,我在这里上传了布局文件:pastebin.com/2xnG1VfF。两个 ListFragment 几乎相同。
-
请看下面我的回答。
-
我总是将视图 ID 设置为
@+id/id_name。我认为 Android 开发者网站上的 View page 有一个很好的解释。此外,正如First app tutorial 所述,仅当您第一次定义资源 ID 时才需要资源类型前的加号 (+)。 我猜您正在定义它第一次? -
@NiklasEkman,感谢您的评论。对于 ListFragment 中的 ListView,这是一种非常特殊的情况,在定义 ListView 时一定不能使用@+id。根据文档,您只能使用 android:id="@android:id/list"。无论如何,这确实是/不是我遇到的问题的根源(丢失的 'android.R.id.list' 异常被抛出是误导性的),因为核心问题看起来与对 ViewGroup 中的引用有关每个 ListFragment 和/或片段被实例化的方式。
标签: android android-listfragment android-fragmentactivity