Android ID命名约定:下划线与驼峰小写


89

我目前正在为Android编写应用程序。现在,我发现您无法将资源对象(例如,图像)放置在drawable文件夹中,并将其命名为“ myTestImage.jpg”。由于不允许使用驼峰语法,因此这将给您带来编译器错误,因此您必须将其重命名为“ my_test_image.jpg”。

但是,您在XML文件中定义的ID呢?说你有以下定义

<TextView android:id="@+id/myTextViewFirstname"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Firstname" />

这是一个有效的定义,可以在我的Android仿真器上编译并正常工作,尽管-如您所见-我以驼峰式语法指定了ID。

现在,Android示例始终使用小写和下划线。这是否只是命名约定,请在ID上使用带下划线的小写字母,否则可能会在实际设备上引起问题?

谢谢

Answers:


87

如果您使用驼峰式ID名称,设备将不会发出投诉。对于我的第一个应用程序,我以驼峰式的方式编写了所有id,因为我认为这样可以更好地在Java代码中显示它,并且效果很好。

不过,我会慢慢改变主意,因为您最终会使用两种不同的命名约定-例如:

// This must be undescored due to naming constrictions
setContentView(R.layout.my_long_layout_name);

// Now this looks a little out of place
findViewById(R.id.myLongSpecificId);

我也想知道这里的标准。Google的示例不一致。有时他们使用所有小写字母,有时使用下划线,有时使用驼峰式。


18
是的,那正是我的问题。它们迫使您对布局使用下划线命名约定,而您可以将驼峰式或下划线作为引用XML布局定义内的控件/小部件的ID。Google应该在这里真正定义一些标准(如果还没有,至少我什么也没发现)。因此,无论您是引用布局还是ID引用字段,采用一种方法都可以确保在整个应用程序中保持最佳一致性。
朱里(Juri)

仅出于好奇:您是否有一个链接,其中Google不一致,也就是说他们使用驼峰式表示法表示ID?
朱里(Juri)

6
为了进一步混淆,项目模板中的样式名称(类似于样式的ID)使用PascalCase,例如AppBaseThemeAppTheme
爱德华·布雷

4
在我所参与的团队中,通常认为下划线方法的可读性要差得多。骆驼式情况下不允许使用的资源文件名有些奇怪的限制不应影响您对其余Java接口的思考-camelCase是根深蒂固,我认为没有人会感谢您在命名约定中强制使用新的“ _”样式。
RichieHH 2014年

3
@RichardRiley我发现这很有趣,因为在使用下划线时,正确地定义了单词边界,而在使用驼峰大小写的情况下,将它们压在一起,因此与用驼峰大小写的名称相比,与下划线分隔的名称相比,我有一个更轻松的解析时间。
2014年

13

如果查看android.R.id.*字段,您会发现所有字段都是驼峰式的。因此,如果android ID以驼峰形式编写,我想我们必须遵循以下约定:)


它们是骆驼的,因为它们是在camelCase中创建的。这并没有为整个社区设置任何编码风格的先例,也没有链接到资源文件的命名约定和ID字符串的命名约定,这正是原始发布者要求的。
RichieHH 2014年

3
是的,它们是在骆驼的情况下创建的。但是这些ID来自android API本身,因此,如果API的创建者使用了驼峰式大小写,我想这是遵循他的约定的一种好方法。
Kiril Aleksandrov 2014年

8
widget_frame字段中也 有字段[ developer.android.com/reference/android/R.id.html#widget_frame]android.R.id.*。Google在此字段中使用下划线而不是驼峰式,因此您对驼峰式约定的结论是正确的,因为ID约定可能是错误的
ahmed hamdy 2015年

4

我认为如果所有小写字母都带有下划线,那是很好的。

看看这个(加上丹尼尔的回答)

  // Camel Case
    TextView tvUserName = (TextView) findViewById(R.id.tvUserName);
    // Small Caps and Underscores
    TextView tvUserName = (TextView) findViewById(R.id.tv_user_name);

以我自己的经验,我倾向于对xml中的驼峰大小写约定感到有些困惑,因为当您将其链接到Java时,它也使用驼峰大小写(因为这是标准的),看起来就像是多啦啦队。


这是非常主观的,并不能回答为什么不能像命名字符串一样命名资源文件的问题。
RichieHH 2014年

3

我认为,如果我们对XML文件中的ID使用下划线约定,对类字段使用骆驼式约定,那么它将为每个开发人员提供更好的可见性,以区分xml ID和类字段。



3
android:id="@+id/frag_account_button"
frag_account_button = ((ListView)view.findViewById(R.id.frag_account_button));

android:id="@+id/fragAccountButton"
fragAccountButton = ((ListView)view.findViewById(R.id.fragAccountButton));

首先,没有确定哪个更合适的标准,但是我对此有自己的想法。我的想法是合理的,以驼峰式惯例将XML id和java变量保留为完全相同的名称。

  1. 通过搜索XML和Java端的项目,很容易找到变量。

  2. butterKnife库定义

    @BindView(R.id.infoTextView)TextViewFont infoTextView;

保持这种方式更合适。


3
Kotlin的视图绑定返回的结果与butterKnife相同,因此我将完全删除snake_case。
里克·马丁斯

1

xml文件名(在drawable文件夹中使用的文件名)必须全部小写,并用下划线字符_分隔,因为xml不支持大写的文件名。


1
这与文件名无关,此外,有些人更喜欢在骆驼框时不要大写首字母。
杰斯珀

海事组织这是一个奇怪的,不确定的问题。您不能区分大小写,不能,但是为什么不禁止在同一目录中具有相同名称根组件的资源文件。
RichieHH 2014年

(顺便说一下,这是关于文件名与资源ID的:重新检查OP)
RichieHH 2014年

0

如果Android的编译器确实按照您所说的限制驼峰大小写(这似乎很奇怪),那么您应该遵循已建立的约定。

违背谷物只会造成不必要的混乱。尽可能在所有地方保持一致。


您可能误解了我想说的话。如果您将资源放在文件中,然后以驼峰形式编写,编译器会抱怨。但是,另一种情况是在XML布局文件中指定ID。在那里,您可以放置​​驼峰ID名称,并且模拟器可以正常运行。现在,正如我所提到的,Google样本均采用my_id_name的形式,但是围绕骆驼式ID名称还有很多其他样本……
Juri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.