- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 ImageView,我需要在 Java 中获取图像宽度和高度,并将它们存储在一些变量中,并在需要时使用它,但是当我想要保存高度和宽度值时,它将向消息字符串返回 NULL 值。
我创建了一些外部方法并将值传递给它以存储值,但它也不起作用,我还创建了一个 TextView 并将值分配给 TextView 文本,它显示在屏幕中,但当我使用 getText 时()
对于获取文本,它获取了 Text View 的默认文本,看,没有任何方法可以从内部类获取值,有什么方法可以从匿名内部类获取值吗?
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()
调用,您有两种选择。您可以将其放在类似的“稍后运行” block 中,或者可以使用某种线程间协调工具。对于前一个选项,添加另一个 OnPreDrawListener
并将调用放在那里。您已经知道如何做到这一点。
对于后一个选项,我推荐 CountDownLatch
。将其初始化为计数 1,在 onPreDraw()
末尾使用 countDown()
,并在其上使用 await()
在调用 Toast.makeText()
之前。这将保证,在 await()
调用返回时,包含 countDown()
调用的代码已完成。请注意,只有当两个代码部分在不同的线程中运行时,这才有效。否则,它就会永远停滞不前。我很确定在这种情况下它们确实在不同的线程中运行,但一般请记住这一点。
关于java - 如何从匿名内部类中获取值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377549/
我是一名优秀的程序员,十分优秀!