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

rei*_*aki 5 android

[更新] - 只是想向大家证实我同意使用硬编码号总是一个坏主意.我很好奇当使用Maps API时,枚举的1,2常量值是什么.如果我找到类似R.id.my_current_location_view的东西,我会觉得更舒服.

我看到这个问题和其他问题中的代码乱七八糟.人们如何知道使用findViewById(1)等?与findViewById(R.id.something);

更改Google Maps API的"我的位置"按钮的位置

这个问题似乎有些深刻的混淆.我想知道神奇的数字findViewById(1)是什么..如果你点击链接你将看到没有人提供setId(1)值到mapView但不知何故人们知道检查父视图然后findViewById( 1)和findViewById(2)..

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

laa*_*lto 5

视图ID只是正整数,非零整数.

如果您使用@+id/name语法在XML中设置视图ID,则生成整数R.java,您需要R.id.name在代码中引用它.

如果您在代码中使用设置了视图ID setId(value),则可以从层次结构中检索具有该id的视图,findViewById(value)其中id值可以是硬编码的正整数,非零整数,例如1或2.

通常在编写代码时,尽量避免使用像这样的幻数常量.


Geo*_*gan 1

总体而言,将这种方法与硬编码 ID 一起使用是一个坏主意,特别是如果您不是设置它们的人,因为它们可能会发生更改。

然而,要回答问题以找出要使用的 id,一种选择是使用 Android Studio 调试器手动遍历视图层次结构进行大量猜测和检查工作。这可能会花费大量时间,因此更简单的方法是仅使用Android Studio 和 Eclipse 中都提供的层次结构查看器

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

在此输入图像描述

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

View locationButton = ((View) mapView.findViewById(1).getParent()).findViewById(2);
Run Code Online (Sandbox Code Playgroud)
  1. findViewById(1)将返回LinearLayout(红色轮廓),因为它的 id 是 1。
  2. getParent()将返回(蓝色轮廓)RelativeLayout的父级LinearLayout
  3. findViewById(2)将找到具有给定 idView的子项。RelativeLayout根据图像,我们看到ImageView我们想要的(绿色轮廓)具有该 id。

基于此,有趣的是我们可以直接mapView.findViewById(2)访问ImageView并避免其他调用。

不确定以前版本中是否存在这种情况,但在使用当前版本时它可以工作MapFragment。如果它在以前的版本上不起作用,那么这有助于证明这是一个不好的做法,因为它可能会在版本之间发生变化。