如何从匿名内部类中获取价值?

问题描述 投票:0回答:1

我有一个ImageView,我需要在Java中获取图像宽度和高度,并将它们存储在一些变量中并使用它我需要的一些时间,但是当我想要保存高度和宽度值时,它将返回消息字符串的NULL值。

我创建了一些外部方法并将值传递给它用于商店值,但它也不起作用,我也创建了一个文本视图,我为TextView文本分配了值,它在屏幕中显示但是当我使用getText()获取文本时它得到了默认值文本视图的文本,看,没有任何方法可以从内部类获取值,有没有办法从匿名内部类获取值?

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"
java anonymous
1个回答
1
投票

您的代码应该很好地获取值,您的问题是您在代码运行之前输出它。 onPreDraw()中的所有代码都没有立即执行,而是定义并设置为稍后运行,只要vto的“preDraw”事件发生。你对Toast.makeText的召唤然后发生在“后来”之前。

要延迟Toast.makeText()通话,您有两种选择。您可以将它放在类似的“稍后运行”块中,或者您可以使用某种类型的线程间协调工具。对于前一个选项,添加另一个OnPreDrawListener并将呼叫放在那里。你已经知道如何做到这一点。

对于后一种选择,我推荐一个CountDownLatch。在countDown()结束时将其初始化为1,onPreDraw()await()末端,Toast.makeText()在它上面,然后调用await()。这将保证,当countDown()调用返回时,qazxswpoi调用的代码已完成。请注意,这仅在两个代码段在不同线程中运行时才有效。否则,它将永远失速。在这种情况下,我很确定它们确实在不同的线程中运行,但总的来说还要牢记这一点。

© www.soinside.com 2019 - 2024. All rights reserved.