2016-02-13 63 views
0

我有一个ImageView,我需要在Java中获取图像宽度和高度,并将它们存储在一些变量中,并根据需要使用它一些次,但是当我想保存高度和宽度值时,它会将NULL值返回给消息字符串。如何从匿名内部类获取价值?

我创造了一些外界方法,并传递价值给它的存储值,但它没有工作过,同样我创建一个文本视图和我分配值TextView的文本,它显示在屏幕上,但是当我用getText()对于GET文本它获得文本视图的默认文本,看看,没有任何方式从内部类获取价值,有什么办法从匿名内部类获取价值?

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" 

回答

1

你的代码应该得到的值就好了,你的问题是,代码运行之前,你输出它。 onPreDraw()中的所有代码不会立即执行,而是定义并设置为稍后运行,无论何时vto的“preDraw”事件发生。您在Toast.makeText的电话会在“稍后”到来之前发生。

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

对于后一种选择,我推荐CountDownLatch。在调用Toast.makeText()之前,在它上面初始化它,最后在onPreDraw()await()的最后加上1,countDown()。这将保证,在await()呼叫返回时,带有countDown()呼叫的代码已完成。请注意,这仅适用于两个代码段运行在不同线程中。否则,它将永远停滞不前。我敢肯定,在这种情况下,他们确实在不同的线程中运行,但请记住一般情况。

+0

谢谢,那么如何运行onPreDraw(),然后运行Toast方法? – MojtabaSh

+0

@MojtabaSh我编辑了一些建议。 – Douglas