Android - 将我自己的唯一整数 ID(不在资源中)设置为以编程方式创建的许多视图

Android - Set my own unique integer id (not in resources) to many views created programmatically

我想为以编程方式创建的多个视图提供 ID,并且每个 ID 都是基于我自己的逻辑的特定整数。考虑以下示例:

  1. 我按顺序定义了 M 种颜色,例如使用枚举,或使用数组来放置 M 个颜色值。 (使用哪个 implementation/structure 是拼图的一部分,也需要为此提供建议,以实现下面描述的最终目标。)
  2. 创建自定义 Class 的 N 个实例,并按顺序存储它们(例如,N 个元素的数组)。此自定义 Class 将只有一个成员 mColor,其中将存储特定实例的颜色。
  3. 创建(始终以编程方式)N 个 RadioGroup,每个 RadioGroup 有 M 个 RadioButton。
  4. 目标是当用户点击第 i 个 RadioGroup 的第 j 个 RadioButton 时,第 i 个实例将使用第 j 个颜色作为背景颜色。

所以,当 RadioGroup 发生 OnCheckedChanged 事件时,我想做这样的事情:

public void onCheckedChanged(RadioGroup group, int checkedId) {
    int i = group.getId();
    /*j variable is not actually needed here, but is used for concistency
    with the description above.*/
    int j = checkedId;

    /*assume for simplicity that an array of N elements is used to store
    the N CustomCLass instances and an array of M elements is used for 
    colors*/
    customClassArray[i].setmColor(colorsArray[j]);
} 

根据以上内容,我认为有必要为以编程方式创建的 RadioGroups 和 RadioButtons 设置特定的 ID。如果有办法做到这一点,那么代码将清晰、优化,并且 N RadioGroups 和 M RadioButtons 不需要 switch 语句(无论如何,我也不知道如何实现它).

实现此目标的最佳方法是什么,首先要考虑效率,其次要考虑清晰的代码?

提前感谢您的任何建议。

编辑: 为了澄清,我已经阅读了关于使用 View.setId() 设置我自己的 ID,但是网上有很多资源反对这个硬编码方法(如果有另一种方法,我也投反对票)并且他们中的许多人建议使用 xml 资源来放置您的 ID。但是,正如我之前所说,我认为这不是我想要实现的目标。 建议这种方法的示例链接:https://code.google.com/p/android/issues/detail?id=75081 or also How to set Id of dynamic created layout?。 此外,这种方法是 android 开发人员文档中建议的方法:http://developer.android.com/guide/topics/resources/more-resources.html#Id

最后,我还阅读了这篇文章:What is the main purpose of setTag() getTag() methods of View?,其中解释了标签的用途和 setTag()/getTag() 方法的使用。这可能是迄今为止我找到的满足我需要的最佳方法。但是,它肯定会引入更复杂、不受支持的代码。不管怎么说,正确的做法,我觉得还是得和ids联系起来,ids的目的是唯一标识views,而不是tags。

当您从 java 创建 RadioGroupsRadioButtons 时,我建议创建一个映射并使用单选按钮引用作为键和实例颜色组合作为值。为所有单选按钮分配一个 checkChangedListener 并按如下方式处理事件

    @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

          colorInstanceCombo = map.get(buttonView);
          //use colorInstanceCombo to do your work    
     }

动态分配 ID 可能会导致问题,因为 ID 是一个整数,您分配的 ID 可能会导致与系统分配给其他组件的 ID 发生冲突。