【问题标题】:Android : Custom object can't preserve resource IDAndroid:自定义对象无法保留资源 ID
【发布时间】:2015-02-19 16:35:43
【问题描述】:

应用在 Gridview 中显示图像。在 GridView 的适配器中,我从可用资源中随机生成 # of images reqd。创建一个新的Integer[] imageIDs,并将这些资源 ID 保存在这个新数组中。我还想将此resourceID 存储在扩展ImageView 的自定义对象ImageSourceObjectArrayList 中。我使用imgObj.setImageResource(imageIDs[i]) 设置了imageView。现在,当我在 onTouch()getView() 方法中检索此对象时,我希望获得与 imageView 集相同的资源,而我得到 -1。

我认为,当我通过 setImageResource() 设置 ImageSourceObject 的 ImageView 时,当我尝试检索 ImageSourceObject 的 getId() 时,我应该获取 ImageView 集的 id。

代码:

    private void createObjectsArray() {
    int totalObjs = 15;
    Integer[] mThumbIds = {
            R.drawable.droid_1, R.drawable.droid_3,
            R.drawable.droid_2, R.drawable.ic_launcher
    };
    // Create new [] for imageIDs to store the resource ID as generated    
    imageIds = new Integer[totalObjs];
    // Create ArrayList of ImageSourceObject to set image & other proeprties 
    this.imgObjsArr = new ArrayList<ImageSourceObject>();

    Random random = new Random();
    int index;
    // Set Targets 
    for (int i=0; i < totalObjs; i++) {
        index = this.generateRandomNumber(0, (mThumbIds.length - 1), random);
        imageIds[i] = mThumbIds[index];
        ImageSourceObject iso = new ImageSourceObject(mContext);
        iso.setImageResource(imageIds[i]);
        imgObjsArr.add(iso);

        Log.d("GA", "ThumbIDS ID : " + mThumbIds[index] + " ImageIDs  : " + imageIds[i] + " ISO IMG ID : " + iso.getId());
    }
}

这段代码的日志:

02-19 12:21:38.780: D/GA(1613): ThumbIDS ID : 2130837557 ImageIDs  : 2130837557 ISO IMG ID : -1

您可以看到mThumbIDsimageIDs 的ID 值是相同的。但是对于iso 对象,设置图像后也是-1 ??

ImageSourceObject 的代码非常简单:

public class ImageSourceObject extends ImageView {

private boolean touched;
private boolean targetObj;

public ImageSourceObject(Context context) {
    super(context);
    setTouched(false);
    setTargetObj(false); 
}

 .... Rest Getter & Setter methods

你能帮我知道为什么ImageSourceObject中没有设置资源ID吗?不设置图像通过setImageResourceImageView 保存它的所有资源???

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 文档对getId 有什么看法?

标签: java android gridview android-resources resource-id


【解决方案1】:

您提供的 id 是您填充到 ImageSourceObject(Drawable)的图像,而不是 ImageSourceObject 本身。 如果你想将 id 设置为这个数字,你应该这样做:

        iso.setImageResource(imageIds[i]);
        iso.setId(imageIds[i]);

【讨论】:

  • 注意 setImageDrawable(getResources().getDrawable(imageIds[i])) 会更好,因为 setImageResource 会阻塞 UI 线程。
  • 那么你的意思是,无论我在哪里使用 setImageResource(),我都应该使用 setImageDrawable()。这不会对我现有的代码产生任何错误,对吧?
  • 谢谢。你也可以在stackoverflow.com/questions/28603664/… 上帮助我吗?我想在用户触摸它时更新图像。我无法刷新它。
【解决方案2】:

您需要使用 iso.setId(int) 来设置 Id

【讨论】:

    【解决方案3】:

    在您的情况下,对于像 ImageSourceObject 这样以编程方式创建的视图,您需要为其分配一个 id usign View.setId(int id)。

    如果您使用 API 级别 17 或更高级别,则可以使用 View.generateViewId() 生成合适的值。根据documentation

    此值不会与构建时生成的 ID 值冲突 适合 R.id。

    不管怎样,根据documentation考虑:

    标识符在此视图的层次结构中不必是唯一的。 标识符应该是一个正数。

    因此,您的 id 可能会发生冲突,Android 将解决它们,并为您提供在给定 id 的层次结构中找到的第一个组件。

    【讨论】:

    • 感谢您提供此信息。我必须支持低于 17 的 API,所以我相信 setId() 将是最好和最合适的。谢谢。
    【解决方案4】:

    使用 setTag(tag) 和 getTag() 方法来设置你的对象:

    iso.setTag(imageIds[i]); //to set the id to object
    
    int tag=(Integer)iso.getTag();// to get the id from object
    

    【讨论】:

    • 谢谢。设置标签也应该起作用(我没有尝试过,但我确信它),但我认为当我们可以只使用 setId() 以正常和正确的方式设置它时,那么为什么要使用 setTag()、类型转换等.
    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多