gpt4 book ai didi

java - 如何从匿名内部类中获取值(value)?

转载 作者:行者123 更新时间:2023-12-01 10:25:26 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com