【问题标题】:What is better android.R or custom R?什么是更好的 android.R 或自定义 R?
【发布时间】:2011-08-16 18:08:31
【问题描述】:

当我开始开发 android 应用程序时,我倾向于在任何需要的地方定义自定义 R 值,尤其是在布局文件中。例如:

findViewById(R.id.customerName).setText(customer.getName())

带布局:

<TextView android:text="TextView" android:id="@id/customerName"
    android:layout_height="wrap_content" android:layout_width="fill_parent" />

现在我意识到,改用android.R 可能会更好。

findViewById(android.R.id.text1).setText(customer.getName())

带布局:

<TextView android:text="TextView" android:id="@android:id/text1"
    android:layout_height="wrap_content" android:layout_width="fill_parent" />

你遵循什么做法?各有什么优缺点?

【问题讨论】:

  • 自定义也...我认为使用自己的东西比使用本机操作系统更好。您无法以任何方式控制它
  • 我不明白。当我使用自定义标识符时,我可以获得什么样的控制权?
  • android:id="@android:id/customerName" - 这是正确的吗?正如它所写的那样,customerName 似乎是在 Android SDk 的顶层定义的 id,但事实并非如此;你想说android:id="@+id/customerName??
  • @保罗。绝对正确。复制/粘贴错误。

标签: android coding-style convention


【解决方案1】:

android.R 用于利用操作系统内置的资源。

操作系统附带了许多图像/布局/等...您可以使用 android.R 引用它们

如果您引用自己创建的资源,大多数总是使用R.,并且在大多数情况下,我建议尽量远离内置资源,因为它们会随着版本的变化而变化。

【讨论】:

  • 好吧,如果你想使用ListActivity,那么你自己创建的布局必须定义一个@android:id/list。这与“始终使用R.为您自己的资源”相矛盾。
  • 另外,我不相信框架资源会因版本而异。那会破坏一切
  • 事实上它们确实如此,例如内置的动画进度指示器,在视觉上会改变每个主要版本...
【解决方案2】:

自定义。系统提供的 ID 存在在代码中引用项目中不存在的资源的风险。如果存在相应的资源 - 可绘制对象、视图、布局或您拥有的任何东西,则存在海关 ID。

【讨论】:

  • 然而,如果您的自定义资源(例如R.id.customerName)在您的项目中以不同的布局定义,findViewById() 将同样失败。我想你不应该仅仅因为它编译就拥有一个工作应用程序。这是代码和 XML 分离所固有的。还是我错过了什么?
  • 嗯,项目的基本正确性仍然有点需要 :) 我从来没有说过使用自定义 ID 可以保护您免受所有可能的错误。仅来自一类特定的错误 - 您尝试加载 android.R.layout.foo,但它并不完全存在。此外,jondavidjohn 所说的系统提供的资源(不仅仅是 ID)。
  • 您是在项目中多次重复使用资源,还是仅为布局定义资源?例如,如果你有两个布局main screencustomer details,你是定义@+id/CustomerNameTextView还是定义@+id/mainScreenCustomerNameTV@+id/customerDetailsCustomerNameTV?跨度>
  • 您的意思是布局视图的 ID?我会,偶尔。但这些仍然是我的自定义 ID。为什么?
  • 因为如果你在多个布局中重复使用@+id/CustomerNameTextView,你会遇到与使用android.R.id.text完全相同的问题:findViewById()can throw a view not found 异常。
【解决方案3】:

框架id vs布局中的自定义id没有太大的优势或劣势。

使用框架标识符的优点:

  • 避免创建更多标识符。在 apk 中保存一个字段(并且存在 apk 大小限制)。
  • 必须在某些情况下使用,例如ListActivity

使用框架标识符的缺点:

  • 请勿提供描述性名称

在这两种做法中

  • 该代码将来可以使用
  • 缺失的引用在运行时被发现,并在编译时隐藏

我认为 SDK 中的示例可以帮助我做出决定,但(你猜怎么着?)它没有。 Notepad 和 LunarLander 应用程序使用 android.R.id 作为视图标识符,而 ApiDemos 项目使用自定义标识符。

混合两种方法的 GestureBuilder 的最佳实践? (@+id/addButton@android:id/empty

IHMO,对于定义 @+id/text @+id/Button01 的 HelloActivity 和 JetBoy 而言,这不是描述性的,可以替换为(@andoid:id/button1@+id/startButton

【讨论】:

    【解决方案4】:

    您需要自己的 R.java 类,因为它包含对所有资源(布局、图像、字符串等)的引用

    如果您想获得对 id 为“myView”的 View 的引用,您可以使用 R.id.myView。 如果您想获得对内置 Android 资源的引用,您可以使用 android.R.id.text

    看看下面的页面:

    http://developer.android.com/guide/topics/resources/accessing-resources.html

    【讨论】:

    • 我已经完成了我的问题,因为你没有抓住重点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2014-02-01
    • 2021-12-28
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多