我有一个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/