[更新] - 只是想向大家证实我同意使用硬编码号码总是一个坏主意。我很好奇当使用Maps API时,枚举的1,2常量值是什么。如果我找到类似R.id.my_current_location_view的东西,我会觉得更舒服。
我在这个问题和其他问题中看到了代码。人们如何知道使用findViewById(1)等?与findViewById(R.id.something);
Change position of Google Maps API's "My location" button
这个问题似乎有些深刻的混淆。我想知道神奇的数字findViewById(1)是什么..如果你点击链接你将看到没有人提供setId(1)值到mapView但不知何故人们知道检查父视图然后findViewById( 1)和findViewById(2)..
我也问过这个问题所以上下文不会丢失,但似乎没有人可以解释这一点。
答案 0 :(得分:5)
视图ID只是正整数,非零整数。
如果您使用@+id/name
语法在XML中设置了视图ID,则会在R.java
中生成整数,您需要在代码中将其称为R.id.name
。
如果您使用setId(value)
在代码中设置了视图ID,则可以使用findViewById(value)
从层次结构中检索具有该ID的视图,其中id值可以是硬编码的正数,非零整数,如1或2。
通常在编写代码时,尽量避免使用像这样的幻数常量。
答案 1 :(得分:1)
将此方法与硬编码ID一起使用是一个总体的坏主意,尤其是如果您不是那些设置它们的人,因为它们可能会发生变化。
但是,要回答问题以确定要使用的ID,一个选项是使用Android Studio调试器进行大量猜测和检查工作,以手动遍历视图层次结构。这可能需要花费大量时间,因此更简单的方法是使用Android Studio和Eclipse中都可用的Hierarchy Viewer。
以下是我们感兴趣的布局部分。我裁剪了完整的布局以显示相关部分。
我们现在可以分解以下代码:
sys.argv[1]
View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2);
将返回findViewById(1)
(红色大纲),因为其ID为1. LinearLayout
将返回getParent()
({1}}(蓝色大纲)的父级。{/ li>
RelativeLayout
会找到具有给定ID的LinearLayout
的孩子findViewById(2)
。根据图像,我们看到我们想要的View
(绿色大纲)具有该ID。基于此,有趣的是我们可以使用RelativeLayout
直接访问ImageView
并避免其他调用。
不确定以前的版本是否是这种情况,但在使用当前mapView.findViewById(2)
时它可以正常工作。如果它在以前的版本上不起作用,那么这有助于证明这是一种不好的做法,因为它可以在不同版本之间进行更改。
答案 2 :(得分:0)
它们都是相同的,在第一种情况下,你自己提供了在R文件中构建的资源标识符,在第二种情况下,你提供了android为你编译的资源标识符。
没有任何区别,
答案 3 :(得分:0)
您必须先使用id
设置视图setId(value)
然后使用id
findViewById(value)
检索视图
发现这篇文章看看它:Link
setid()
的{p> Documentation说:
设置此视图的标识符。在该视图的层次结构中,标识符不必是唯一的。标识符应为正数。