【问题标题】:How to add ID to programmed layout item (android) in JAVA如何在 JAVA 中将 ID 添加到编程的布局项(android)
【发布时间】:2015-04-07 22:05:30
【问题描述】:

我正在向 Java 代码中的布局添加多个元素。例如 java 在 imageview 之前编码到已知的 layout 与一些 layoutparams

layout.addView(imageview, layoutparams);

我认为我不能在 XML 中执行此操作,因为我不知道将添加多少元素(由用户确定)。

我需要为这些添加的元素设置并知道 ID,以便以后可以参考它们

我需要的是(添加之前):

imageview.setId(??);

这是一个好方法吗?如果是这样,我该如何使用它? 我主要担心的是我不确定 R.id 是如何工作的。 例如,我可以将这些 ID 设为 100001、100002、100003... 吗?我不会覆盖任何东西吗? 我会将这些 ID 存储在列表/数组中,以便稍后在代码中使用。

public static int generateViewId ()

在 API 级别 17 中添加 生成适合在 setId(int) 中使用的值。 此值不会与构建时生成的 ID 值冲突 适合 R.id。

如果由于多个方法添加元素而在运行时发生碰撞怎么办。有没有类似sql的事务? 顺便说一句:使用 API17 并不是我想要的。略超过 50% 的市场份额。

【问题讨论】:

  • 您真的需要这些视图的 id 吗? View refs 还不够好?
  • 如果项目数量未知,我宁愿使用layout.getChildAt()layout.getChildCount() 管理它们。基本上你想设置一个增量int 引用,但你已经有了一个。无论如何,这取决于您将如何处理这些视图。

标签: java android xml layout


【解决方案1】:

如果您需要获取对某个View 的引用,该引用会动态添加到一堆其他类似的视图中,您可能需要使用类似于下面的循环:

for(int i = 0; i < parent.getChildCount(): i++) {

   View view = parent.getChildAt(i);

}

如果您需要更多控制权,那么您可能需要查看View.setTag() 方法。使用它,您可以为每个 View 创建一个唯一标签,然后在循环中检索它。

final ImageView imageView = (ImageView) findViewById(R.id.imageview);
imageView.setTag("I'm a tag!");

for(int i = 0; i < parent.getChildCount(): i++) {

   View view = parent.getChildAt(i);

   if(view != null && view.getTag() == "I'm a tag!") {

       // Do something with the View

   }

}

虽然上面的代码应该可以工作,但我可能会建议根据您打算对视图执行的操作从不同的角度解决问题。

【讨论】:

    【解决方案2】:

    findViewById 方法需要唯一的 ID 才能正常工作。但是,不能保证 ID 在ViewGroup 的上下文中是唯一的。如果您使用 xml 方式生成布局,android 构建工具会为所有元素生成唯一的 ID,但如果您手动创建并将它们添加到容器中,则不会生成 ID。如果有多个 ID 相同的视图,findViewById 方法将返回树视图结构中 ID 等于给定视图的第一个视图。

    您可以安全地使用generateViewId() 方法。没有必要同步它的使用(你称之为交易),因为 android 的人已经为你做了这个。您可以安全地使用它,而不必担心重复的 ID。

    我希望这将帮助您理解 ID 的概念和需求:)

    【讨论】:

    • 请注意,单个布局中的 id 冲突可能会干扰保存视图状态,因为保存的状态保存在基于平面 id 的SparseArray
    • 是的,你是对的,谢谢 :) 使用 generateViewId() 可以让你远离这种情况。
    【解决方案3】:

    AFAIK,imageview.setId(); 不会通过从 R 文件中获取此源来损害您的资源识别,但在您的情况下,我更喜欢使用标签:

    imageview.setTag(100001);
    

    并得到它:

    int id = Integer.parseInt(imageview.getTag().toString().trim());
    

    如果你已经以某种方式使用了视图标签,你可以给它另一个带有 key 的标签,就像你的 app-name 一样:

    imageview.setTag(R.string.app_name, 100001);
    

    并获取 id:

    int id = Integer.parseInt(imageview.getTag(R.string.app_name).toString().trim());
    

    【讨论】:

    • 请注意,单个布局中的 id 冲突可能会干扰保存视图状态,因为保存的状态保存在基于平面 id 的SparseArray
    • @corsair992 事实上,这些东西让我完全不使用 ID,这就是我鼓励使用标签的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多