3

我需要通过 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 定义这样的方法。关于如何实现这一点的任何想法?

4

2 回答 2

1

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

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

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

于 2013-11-07T12:21:05.353 回答
1

我猜 some_pic ImageView 是在 XML 中声明的,然后被夸大了,可能是在你的 Activity 类中调用 setContentView 。膨胀意味着 Android 读取 XML 并将其转换为 Java 对象。一旦你调用了 setContentView,所有的对象都会被实例化,然后再去改变它们的类就太晚了,比如重写 ImageView 的 onMeasure 方法。

我可以想到两个选择:

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

    <com.mycompany.myproject.MyImageView
        android:id="@+id/some_pic"
        ...
    />

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

于 2013-10-31T12:12:17.053 回答