【问题标题】:Is there any legitimate use for @+android:id?@+android:id 有什么合法用途吗?
【发布时间】:2014-10-27 15:35:18
【问题描述】:

在我将我的 android 工具升级到最新版本以在 API21 上工作后,尝试编译我的项目导致以下错误:

  • update_languages_button_preference_layout.xml:2:注意:您的意思是使用 @+id 而不是 @+android:id
  • update_languages_button_preference_layout.xml:2:错误:为外部包 android:id/layout 创建资源。
  • update_languages_button_preference_layout.xml:2:错误:错误:未找到与给定名称匹配的资源(在 'id' 处,值为 '@+android:id/layout')。

问题似乎出在android:id="@+android:id/layout"这一行:用@+id替换@+android:id就足以让项目能够正常编译运行.

然而,对整个代码库的快速搜索发现了项目中使用构造 android:id="@+android:id/... 的其他几个位置。这些显然并没有阻止项目通过所有测试,即使我不能保证它们都仍在使用中。

  • 是否有任何合法使用 android:id="@+android:id 可以证明将这些引用保留在我们的 xml 文件中,而不是将它们全部替换为 @+id

  • 为什么他们没有引发与第一个文件相同的错误?

【问题讨论】:

  • 不,至少@+android:id/... 你可以使用@android:id/...(没有+) 用于特殊ID,如fx:@android:id/list 用于ListFragment/Activity @+... 表示创建新ID,如果不存在...我看不出创建新的android:id ids 的意义
  • 谢谢,这确实是我对第一个问题的回答。但是,您知道为什么只有一个这些引用阻止了项目的构建吗?
  • 我也面临这个问题。 Android API 21 不接受此声明。我必须回到 SDK for Android 4.4,等到这个问题得到解决。
  • @Phuong:你是什么意思,“等到这可以解决”?唯一的解决办法是更新错误的引用以使用有效的语法。

标签: android xml android-5.0-lollipop android-identifiers


【解决方案1】:

不,您应该从不在您的应用中使用@+android:id。 android 命名空间是为框架保留的。这对应用来说从来都不是安全的,现在会产生编译错误。

作为背景知识,在 android 命名空间中生成新 ID 会将它们放在现有 android 命名空间 ID 之后的未使用空间中。这将正常工作,直到在框架中添加新 ID,此时您的内部 ID 将与实际框架 ID 重叠并导致奇怪的问题。

至于其他实例,那些也应该产生错误。 AAPT 中可能存在错误。无论如何,您应该从资源中删除所有 @+android 实例。

【讨论】:

  • 感谢您的回答。除了可能不再通过项目引用这些布局的可能性之外,您是否看到其他引用不生成构建错误的任何原因?
  • 不,如果它们实际上正在编译,它们应该会产生错误。这可能是一个 AAPT 错误。我强烈建议修复它们,即使它们在编译时没有产生错误,因为可能会在运行时引起问题。
【解决方案2】:

虽然我的评论很晚。我今天在更新我的 Eclipse 和工具时遇到了同样的问题。将 @+android:id 更改为 @+id 并解决了我的问题。

【讨论】:

  • 当心通过项目更新可能无效的潜在引用,例如findViewById(R.android.id.xxx),到达时会抛出RuntimeException
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多