如何以编程方式为视图分配 ID?

2023-12-26

在 XML 文件中,我们可以为视图分配一个 ID,例如android:id="@+id/something"然后打电话findViewById(),但是当以编程方式创建视图时,如何分配 ID?

I think setId()与默认分配不同。setId()是额外的。

有人可以纠正我吗?


Android id概述

安卓id是一个常用于标识视图的整数;这id可以通过 XML(如果可能)和代码(以编程方式)进行分配。id对于获取 XML 定义的引用最有用Views 由一个生成Inflater(例如通过使用setContentView.)

Assign id via XML

  • 添加一个属性android:id="@+id/somename"以你的观点。
  • 当您的应用程序构建时,android:id将被分配一个unique int用于代码中。
  • 参考你的android:id's int代码中的值使用“R.id.somename”(实际上是一个常量。)
  • this int可以从构建到构建进行更改 so 切勿复制 id from gen/包裹名字/R.java,只需使用“R.id.某个名字”。
  • (此外,一个id分配给一个Preference在 XML 中不使用时Preference生成其View.)

Assign id通过代码(以编程方式)

  • 手动设置ids using someView.setId(int);
  • The int必须是积极的,但在其他方面是任意的——它可以是你想要的任何东西(如果这很可怕,请继续阅读。)
  • 例如,如果创建表示项目的多个视图并对其进行编号,则可以使用它们的项目编号。

的独特性ids

  • XML-指定的ids 将是独一无二的。
  • 代码分配ids do not必须是独一无二的
  • 代码分配ids 可以(理论上)与XML-指定的ids.
  • 这些相互矛盾的id如果查询正确,s并不重要(继续阅读).

何时(以及为何)发生冲突id没关系

  • findViewById(int)将通过视图层次结构递归地深度优先迭代从您指定的视图并返回第一个View它找到匹配的id.
  • 只要没有分配代码ids 在 XML 定义之前分配id在层次结构中,findViewById(R.id.somename)将始终返回 XML 定义的视图,因此id'd.

动态创建视图并分配IDs

  • 在布局 XML 中,定义一个空的ViewGroup with id.
  • 比如一个LinearLayout with android:id="@+id/placeholder".
  • 使用代码填充占位符ViewGroup with Views.
  • 如果您需要或想要,请分配任何id每个视图都很方便。
  • 使用 placeholder.findViewById(convenientInt) 查询这些子视图;

  • API 17 推出View.generateViewId()它允许您生成一个唯一的 ID。

如果您选择保留对您的观点的引用,请务必将它们实例化为getApplicationContext()并确保将每个引用设置为 nullonDestroy。显然leaking the Activity(在被销毁后挂在它上面)是浪费..:)

保留 XMLandroid:id用于代码中

API 17 推出 View.generateViewId() 它生成一个唯一的 ID。(感谢 take-chances-make-changes 指出了这一点。)*

If your ViewGroup无法通过 XML 定义(或者您不希望如此),您可以通过 XML 保留 id 以确保它保持唯一:

Here, 值/ids.xml定义一个自定义id:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="reservedNamedId" type="id"/>
</resources>

然后,一旦创建了 ViewGroup 或 View,您就可以附加自定义 id

myViewGroup.setId(R.id.reservedNamedId);

冲突id example

为了清楚起见,通过令人困惑的示例,让我们检查一下当存在以下情况时会发生什么:id幕后冲突。

布局/mylayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/placeholder"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
</LinearLayout>

为了模拟冲突,假设我们分配了最新的构建R.id.placeholder(@+id/placeholder) an int的价值 12..

Next, 我的活动.java以编程方式定义一些添加视图(通过代码):

int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
    TextView tv = new TextView(this.getApplicationContext());
    // One new TextView will also be assigned an id==12:
    tv.setId(i);
    placeholder.addView(tv);
}

So placeholder以及我们的新产品之一TextView两者都有一个id共 12 个!但如果我们查询占位符的子视图,这并不是真正的问题:

// Will return a generated TextView:
 placeholder.findViewById(12);

// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12: 
Activity.this.findViewById(12);

*还不错

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式为视图分配 ID? 的相关文章

随机推荐

  • android.view.Surface - OutOfResourcesException

    我有这个奇怪的错误 但没有找到任何可能的解决方案 在使用我的应用程序后 问题总是随机出现 该应用程序几乎可以在所有设备上完美运行 仍然存在此问题的设备之一正在运行 CM 7 1 0 我知道很多 CM7 用户都在抱怨类似的问题 不幸的是 我有
  • 如何有条件地在 JSP 页面中显示一个 div 的内容而不是另一个 div 的内容?

    我对JSP开发很陌生 我有以下疑问 如果进入 JSP 页面我有 2div像这样 div p SUCCESS p div div p FAILURE p div 我必须根据 a 的值仅显示这些 div 之一status变量放入Http会话只能
  • 比较文件内字母顺序的最佳方法?

    我有一个文件 其中有很多字母序列 其中一些序列可能是相同的 所以我想对它们进行全部比较 我正在做这样的事情 但这并不完全是我想要的 for line in fl line line split for elem in line if gt
  • Go HTTP 服务器性能问题

    我正在编写一个事件收集器http 服务器 该服务器将承受重负载 因此 在 http 处理程序中 我只是反序列化事件 然后在 goroutine 中的 http 请求 响应周期之外运行实际处理 由此 我发现如果我以每秒 400 个请求的速度访
  • Json反序列化,创建重复对象

    展示问题的模型比首先尝试解释它更容易 internal class Program private static void Main string args Class1 class1 new Class1 Name Scott Class
  • 有没有办法在调用构造函数之前设置属性?

    是的 我知道依赖项应该传递给构造函数 我不是在问编码风格或该做什么和不该做什么 我的应用程序中的许多类都与数据库驱动程序类的实例相关联 为此 我使用 PHP 的后期静态绑定创建了一个抽象工厂类 该类的唯一成员是保存驱动程序引用的属性 它看起
  • 目标 C:多名代表

    我很好奇是否以及如何使控制器成为两个不同对象的委托 这是允许的还是像 Java 中的多重继承 假设我想要一个控制器来响应
  • Openshift 上的 Scalatra 应用 - 设置 Jetty IP

    我正在尝试使用 DIY 盒在 Openshift 上部署一个最小的 Scalatra 应用程序 我已经成功让 SBT 正常工作 但是当涉及到container start 我收到错误 FAILED SelectChannelConn ema
  • 如何设置浮动 div 的宽度以占用剩余空间而不将其他 div 向下推?

    对于我想要制作的布局的一部分 我想使用三个 div 所有 div 都彼此相邻浮动 左侧和右侧有一个最大宽度设置 效果很好 但我希望中间的 div 扩大其宽度以填充剩余空间 澄清一下 左右 div 的宽度可以是从 0px 到最大宽度的任何位置
  • 枚举,在 switch case 中使用

    我定义了一个枚举 其中包含方法返回类型 如 String Float List Double 等 我将在 switch case 语句中使用它 例如我的枚举是 public enum MethodType DOUBLE LIST STRIN
  • 在多个故事板文件之间共享场景。 iPhone 与 iPad

    我正在使用故事板开发通用应用程序 我有 2 个故事板文件 一款适用于 iPhone 一款适用于 iPad 我将有一些场景想要在两者之间共享 并且我想使用故事板编辑器来设置它们 常见的是 UITableViewController 及其原型单
  • android:来自片段的菜单项单击事件

    我有一个带有操作栏的应用程序 并且菜单因主要活动而膨胀 我想拦截片段内的点击事件 但我不知道如何 你能帮我吗 主要活动 Override public boolean onCreateOptionsMenu Menu menu getMen
  • 如何使用预测和标准获得不同的结果

    我正在尝试使用 Grails 中的条件加载不同的父级 查询如下 Query def criteria Parent createCriteria results criteria list max params max offset par
  • Google Apps 脚本 JDBC 连接问题

    我在 google apps 脚本中使用 jdbc 连接器连接到任何 mysql 数据库时遇到问题 我正在使用教程代码 var conn Jdbc getConnection jdbc mysql host or ip 3306 datab
  • Windows 10 - System.Speech.Synthesis 无法获取移动版语音

    在我的 Windows 10 语言中 我安装了 2 个英语版本 US 英国 因此 在 设置 gt 时间和语言 gt 语音 中 在 文本转语音 部分下 我可以看到以下选项 微软大卫移动 微软乔治移动 微软苏珊移动 微软榛子移动 微软 Zira
  • 将 PDF 插入 Excel、Python

    我编写了一个 python 脚本 用于创建包含各种计算的电子表格 我想进一步将 pdf 插入电子表格 pdf 是理想的 但 jpeg 也可用 我翻遍了xlwt 没有找到任何东西 谁能建议一种方法来实现这一目标 要实际插入 PDF 您可能只需
  • 为瘦服务器和 sinatra 启用 SSL

    我正在尝试为我的瘦服务器 Web 应用程序启用 SSL 以便它可以通过 HTTPS 运行 我已完成以下操作 启动瘦网络服务器 我的应用程序 运行 主机 gt 127 0 0 1 端口 gt 9090 sslenable gt true ss
  • 使用ADT和SDK管理器,将android源代码附加到eclipse

    安装ADT后 我使用SDK Manager下载最新的android API的源代码 现在 当我运行ADT附带的Eclipse版本时 我仍然看不到android源代码 有没有简单的方法来解决这个问题 打开SDK Manager gt 在api
  • 如何在运行时从 NUnit 测试运行中获取单元测试方法属性?

    我将有关给定测试的各种信息 多个错误跟踪系统的 ID 存储在属性中 如下所示 TestCaseVersion 001 B 8345 X543 public void TestSomethingOrOther 为了在测试过程中获取这些信息 我
  • 如何以编程方式为视图分配 ID?

    在 XML 文件中 我们可以为视图分配一个 ID 例如android id id something 然后打电话findViewById 但是当以编程方式创建视图时 如何分配 ID I think setId 与默认分配不同 setId 是