我有一个ImageView,我需要用Java获取Image Width和Height并将它们存储在某些变量中,并在需要的时候使用它,但是当我要保存height和width值时,它将向消息字符串返回NULL值。

我创建了一些外部方法并将值传递给它来存储值,但它也无法正常工作。我还创建了一个文本视图,并为TextView文本分配了值,它在屏幕上显示,但是当我使用getText()来获取文本时,得到了Text视图的默认文本,看,没有任何方法可以从内部类中获取价值,有什么方法可以从匿名内部类中获取价值吗?

final String[] message = new String[2];
final ImageView iv = (ImageView)findViewById(R.id.main_item2);
final TextView tv = (TextView)findViewById(R.id.storePostions);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
  public boolean onPreDraw() {
      iv.getViewTreeObserver().removeOnPreDrawListener(this);
      int finalHeight, finalWidth;
      finalHeight = iv.getMeasuredHeight();
      finalWidth = iv.getMeasuredWidth();
      message[0] = String.valueOf(finalHeight);
      message[1] = String.valueOf(finalWidth);
      return true;
    }
});

Toast.makeText(MainActivity.this, "finalHeight = " + message[0] + " ,finalWidth = " + message[1], Toast.LENGTH_LONG).show();
// show "finalHeight = NULL ,finalWidth =  NULL"

最佳答案

您的代码应该可以很好地获取值,您的问题是在代码运行之前就已将其输出。 onPreDraw()中的所有代码不会立即执行,而是被定义并设置为在vto的“ preDraw”事件发生时稍后运行。然后,您对Toast.makeText的调用发生在该“稍后”出现之前。

要延迟Toast.makeText()调用,您有两个选择。您可以将其放在类似的“稍后再运行”块中,也可以使用某种线程间协调工具。对于前一个选项,添加另一个OnPreDrawListener并将呼叫放在此处。您已经知道该怎么做。

对于后一种选择,我建议使用CountDownLatch。首先将其初始化为1,在countDown()的末尾加上onPreDraw(),然后在调用await()之前对其进行计数。这将确保在Toast.makeText()调用返回时,带有await()调用的代码已经完成。请注意,这仅在两个代码段在不同线程中运行时才有效。否则,它将永远停止。我很确定在这种情况下它们确实可以在不同的线程中运行,但是请记住这一点。

关于java - 如何从匿名内部类中获得值(value)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35377549/

10-10 11:27