有人可以向我解释FindViewById(1)或FindViewById(2)背后的魔力吗?

时间:2014-09-17 06:11:47

标签: android

[更新] - 只是想向大家证实我同意使用硬编码号码总是一个坏主意。我很好奇当使用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)..

我也问过这个问题所以上下文不会丢失,但似乎没有人可以解释这一点。

4 个答案:

答案 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

以下是我们感兴趣的布局部分。我裁剪了完整的布局以显示相关部分。

enter image description here

我们现在可以分解以下代码:

sys.argv[1]
  1. View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2); 将返回findViewById(1)(红色大纲),因为其ID为1.
  2. LinearLayout将返回getParent()({1}}(蓝色大纲)的父级。{/ li>
  3. RelativeLayout会找到具有给定ID的LinearLayout的孩子findViewById(2)。根据图像,我们看到我们想要的View(绿色大纲)具有该ID。
  4. 基于此,有趣的是我们可以使用RelativeLayout直接访问ImageView并避免其他调用。

    不确定以前的版本是否是这种情况,但在使用当前mapView.findViewById(2)时它可以正常工作。如果它在以前的版本上不起作用,那么这有助于证明这是一种不好的做法,因为它可以在不同版本之间进行更改。

答案 2 :(得分:0)

它们都是相同的,在第一种情况下,你自己提供了在R文件中构建的资源标识符,在第二种情况下,你提供了android为你编译的资源标识符。

没有任何区别,

答案 3 :(得分:0)

您必须先使用id设置视图setId(value)然后使用id

使用findViewById(value)检索视图

发现这篇文章看看它:Link

setid()的{​​p> Documentation说:

设置此视图的标识符。在该视图的层次结构中,标识符不必是唯一的。标识符应为正数。