Android id 命名约定:带下划线的小写与驼峰式
Posted
技术标签:
【中文标题】Android id 命名约定:带下划线的小写与驼峰式【英文标题】:Android id naming convention: lower case with underscore vs. camel case 【发布时间】:2009-12-02 11:17:37 【问题描述】:我目前正在为 android 编写一个应用程序。现在我发现您不能将资源对象(例如图像)放在可绘制文件夹中并将其命名为“myTestImage.jpg”。这会给您一个编译器错误,因为不允许使用驼峰式语法,因此您必须将其重命名为“my_test_image.jpg”。
但是您在 XML 文件中定义的 id 呢?假设您有以下定义
<TextView android:id="@+id/myTextViewFirstname"
android:layout_
android:layout_
android:text="Firstname" />
这是一个有效的定义,在我的 Android 模拟器上编译和工作都很好,尽管 - 正如你所看到的 - 我在驼峰式语法中指定了 id。
现在,Android 示例始终使用小写字母和下划线。这只是一个命名约定,使用带有下划线的小写 id 还是可能会在真实设备上导致问题?
谢谢
【问题讨论】:
使用新的viewbinding
视图的 ID 会自动转换为驼峰式。
【参考方案1】:
如果您使用驼峰式 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);
我也想知道这里的标准。谷歌在他们的例子中不一致;有时他们使用全小写,有时他们插入下划线,有时他们使用驼峰式。
【讨论】:
是的,这正是我的问题。它们强制您对布局使用带下划线的命名约定,而您可以使用驼峰式或带下划线的 id 来引用 XML 布局定义中的控件/小部件。谷歌真的应该在这里定义一些标准(如果他们还没有,至少我没有找到任何东西)。因此,无论您引用布局还是引用 id 的字段,都可以确保在整个应用程序中保持一致。 只是为了好奇:您是否有一个链接与 Google 不一致,这意味着他们在哪里使用骆驼大小写表示法的 ids? 为了进一步混淆,项目模板中的样式名称(类似于样式的 ID)使用 PascalCase,例如AppBaseTheme
和 AppTheme
.
在我参与的团队中,通常认为下划线方法的可读性要低得多。资源文件名称不允许使用驼峰式大小写的有点奇怪的限制不应该污染您对其余的 Java 接口 - camelCase 已根深蒂固,我认为没有人会感谢您在命名约定中强制采用新的“_”样式。
@RichardRiley 我觉得这很有趣,因为对于下划线,单词边界是正确定义的,而对于驼峰大小写,它们被挤压在一起,因此我解析下划线分隔的名称比解析驼峰大小写的名称更容易。 【参考方案2】:
如果您查看android.R.id.*
字段,您会注意到它们都是驼峰式的。所以如果android ids是用驼峰写的,我想我们必须遵循这个约定:)
【讨论】:
它们是骆驼式的,因为它们是用骆驼式创建的。这并没有为整个社区设置任何编码风格的先例,并且这与资源文件的命名约定与原始发布者所询问的 ID 字符串的命名约定无关。 是的,它们是用骆驼皮制作的。但是这些 ID 来自 android API 本身,所以如果 API 的创建者使用骆驼案例,我想这是遵循他的约定的好方法。widget_frame
字段 [developer.android.com/reference/android/R.id.html#widget_frame] 也在 android.R.id.*
字段中。在这个领域谷歌使用下划线不是驼峰所以你关于驼峰约定的结论是正确的选择ID约定可能是错误的【参考方案3】:
我认为如果我们使用带有下划线的所有小写字母会很好。
看看这个(添加丹尼尔回答的内容)
// Camel Case TextView tvUserName = (TextView) findViewById(R.id.tvUserName);
// Small Caps and Underscores
TextView tvUserName = (TextView) findViewById(R.id.tv_user_name);
根据我自己的经验,我倾向于对 xml 中的驼峰式大小写约定感到有些困惑,因为当您将它链接到也使用驼峰式大小写的 Java 时(因为它是标准),它看起来像一个分身。
【讨论】:
这是非常主观的,并没有回答关于为什么不能像 ID 字符串一样命名资源文件的问题。【参考方案4】:如果您查看一些 Google 应用示例,例如:
https://github.com/google/iosched
他们使用下划线。所以....也许我们应该这样做?
【讨论】:
但是如果你看到其他布局文件那么你会发现一些视图的id是驼峰式的。所以我想这完全取决于开发人员方面什么对团队更好。这是链接,其中有一个用于 Recycler ID 的骆驼箱。 github.com/google/iosched/blob/main/mobile/src/main/res/layout/…【参考方案5】: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 变量的名称与驼峰式约定完全相同。
通过搜索XML和java端的项目很容易到达变量。
butterKnife 库定义
@BindView(R.id.infoTextView) TextViewFont infoTextView;
这样保存比较合适。
【讨论】:
Kotlin's view binding 返回的结果与 butterKnife 相同,所以我完全放弃了 snake_case。【参考方案6】:我认为,如果我们在 xml 文件中对 id 使用下划线约定,对类字段使用驼峰式约定,那么它将为每个开发人员提供更好的可见性,以区分 xml id 和类字段。
【讨论】:
【参考方案7】:xml 文件名(在可绘制文件夹中使用)必须全部小写,并用下划线字符 _ 分隔,因为 xml 中不支持大写文件名。
【讨论】:
这不是关于文件名的问题,而且有些人喜欢在驼峰式大小写时不将第一个字母大写。 这是一个奇怪的不一致问题 IMO。你不能区分大小写,不,但为什么不直接禁止在同一目录中具有相同名称根组件的资源文件。 (顺便说一句,它是关于文件名与资源 ID:重新检查 OP)【参考方案8】:如果 Android 的编译器确实按照您所说的限制驼峰式大小写(这看起来很奇怪),那么您应该遵守既定的约定。
违背规律只会造成不必要的混乱。 尽可能在所有地方保持一致。
【讨论】:
你可能误解了我的意思。如果您将文件之类的资源放在骆驼案例中,编译器会抱怨。然而,另一种情况是您在 XML 布局文件中指定 ID。在那里你可以放置驼峰式 id 名称,并且模拟器工作得很好。现在,正如我所提到的,Google 示例都采用 my_id_name 的形式,但是还有很多其他示例都具有驼峰式 id 名称...以上是关于Android id 命名约定:带下划线的小写与驼峰式的主要内容,如果未能解决你的问题,请参考以下文章