通过Id获取ImageView后覆盖onMeasure

时间:2013-04-18 08:29:19

标签: android override android-imageview findviewbyid

我需要通过id查找视图,然后覆盖其onMeasure方法。有谁知道怎么做?

以下内容在Java中不起作用,但从概念上讲它是我需要的:

ImageView myImage = (ImageView) findViewById(R.id.some_pic);
myImage.onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  int width = MeasureSpec.getSize(widthMeasureSpec);
  int height = MeasureSpec.getSize(heightMeasureSpec);
    showOther(width, height);
};

myImage.setImageBitmap(bmp);

Java提供此

ImageView myImage = new ImageView(this) {
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    showOther(width, height);               }
};

或者

ImageView myImage. = (ImageView) findViewById(R.id.some_pic);
myImage.setImageBitmap(bmp);

我想过使用setOnMeasureListener但是没有为ImageView定义这样的方法。关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:1)

我猜测some_pic ImageView是用XML声明然后膨胀的,可能是通过在Activity类中调用setContentView。通货膨胀意味着Android读取XML并将其转换为Java对象。一旦调用setContentView,所有对象都会被实例化,之后对它们的类​​进行更改为时已晚,例如重写ImageView的onMeasure方法。

我可以想到两个选择:

  1. (首选)创建一个扩展ImageView并覆盖onMeasure的新类。在XML中声明some_pic时,不要使用ImageView标记,而是在新类(完全限定名称)之后命名标记:

    < com.mycompany.myproject.MyImageView
        机器人:ID = “@ + ID / some_pic”
        ...
    />

  2. 不要在XML中声明some_pic。在Activity的onCreate方法中,在调用setContentView之后,实例化一个新的ImageView并覆盖其onMeasure方法,就像你在问题的第一个Java选项中所做的那样。您必须手动将此ImageView插入到布局中;使用Google了解如何将视图插入另一个视图(here's an example)。

答案 1 :(得分:1)

我遇到了和你一样的问题。 也许你已经解决了这个问题,但这里没有明确的解决方案。 只需在新类中扩展ImageView,例如MyImageView,并在布局定义中使用它。这样你就可以使用:

MyImageView myImage = (MyImageView) findViewById(R.id.some_pic);

可以在第二个答案中找到示例类和xml: ImageView be a square with dynamic width?